我对编程相当陌生,特别是在涉及到图书馆和类似活动的时候。 过去我一直在使用Python进行编程,而且我一直在使用GTK来创build窗口,这也是我在使用c ++进行编程时所要做的。 要开始的事情,这是我的代码:
#include <stdlib.h> #include <gtk/gtk.h> static void helloWorld (GtkWidget *wid, GtkWidget *win) { GtkWidget *dialog = NULL; dialog = gtk_message_dialog_new (GTK_WINDOW (win), GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "Hello World!"); gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); } int main (int argc, char *argv[]) { GtkWidget *button = NULL; GtkWidget *win = NULL; GtkWidget *vbox = NULL; /* Initialize GTK+ */ g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, (GLogFunc) gtk_false, NULL); gtk_init (&argc, &argv); g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, g_log_default_handler, NULL); /* Create the main window */ win = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size(GTK_WINDOW (win), 400, 300); gtk_container_set_border_width (GTK_CONTAINER (win), 8); gtk_window_set_title (GTK_WINDOW (win), "test"); gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_CENTER); gtk_widget_realize (win); g_signal_connect (win, "destroy", gtk_main_quit, NULL); /* Create a vertical box with buttons */ vbox = gtk_vbox_new (TRUE, 6); gtk_container_add (GTK_CONTAINER (win), vbox); button = gtk_button_new_from_stock (GTK_STOCK_DIALOG_INFO); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (helloWorld), (gpointer) win); gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0); button = gtk_button_new_from_stock (GTK_STOCK_CLOSE); g_signal_connect (button, "clicked", gtk_main_quit, NULL); gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0); /* Enter the main loop */ gtk_widget_show_all (win); gtk_main (); return 0; }
代码是从我在互联网上find的“Hello world”示例中取得的。
我知道这个问题已经得到了答案,但是我的情况要复杂得多(至less从我的angular度来看)。 首先,我已经安装了所有需要的软件包。 顺便说一句,我运行Ubuntu 14.04。
当我使用g++ main.cpp
编译代码时,出现以下错误:
main.cpp:2:21: fatal error: gtk/gtk.h: No such file or directory #include <gtk/gtk.h> ^ compilation terminated.
对于这个特定的错误有一个修复,就是像这样扩展编译命令: g++ main.cpp -I/usr/include/gtk-2.0
。 然而,这将提供另一个类似的错误:
In file included from /usr/include/gtk-2.0/gdk/gdk.h:32:0, from /usr/include/gtk-2.0/gtk/gtk.h:32, from main.cpp:2: /usr/include/gtk-2.0/gdk/gdkapplaunchcontext.h:30:21: fatal error: gio/gio.h: No such file or directory #include <gio/gio.h> ^ compilation terminated.
你可以通过扩展这个命令来解决这个问题(所有的命令在互联网上都是基金,我不太了解): g++ -g -Wall -c -o program.o main.cpp -I/usr/include/gtk-2.0 $(pkg-config --libs --cflags glib-2.0)
。 现在cairo.h
会出现错误。
正如你可以看到有类似的错误。 我不知道什么是错,但我必须相信有一个相对简单的解决办法。
另外,我尝试了全新安装的Ubuntu(只需安装软件包),并发生相同的错误。
当包含某个包时, pkgconfig
命令为您提供编译器的所有必需的-I
(include)和-l
(linker)语句。
看一下跑步给出的是什么:
pkgconfig --cflags --libs gtk+-2.0
我已经尝试在我的Ubuntu 14.04.1上编译你的代码,并且在我使用的时候它很好:
g++ main.cpp `pkg-config --cflags --libs gtk+-2.0`
可能是pkg-config --libs --cflags glib-2.0
不足以提供所有必需的包含路径和共享库。
当你没有在Ubuntu上安装文件时,要去的地方是http://packages.ubuntu.com,并使用第二个搜索表单来查找文件名。
在这种情况下 ,答案是(对于可靠 ):
File Package ----------------------------------------------------------------- /usr/include/gtk-2.0/gtk/gtk.h libgtk2.0-dev /usr/include/gtk-3.0/gtk/gtk.h libgtk-3-dev /usr/lib/R/site-library/RGtk2/include/RGtk2/gtk.h r-cran-rgtk2
您需要选择哪一个最合适,然后安装。
我猜这个: libgtk2.0-dev
然后你可以为gio/gio.h
头文件重复这个过程。
这是作品(Ubuntu):
export CPATH=$CPATH:/usr/include/gtk-2.0 export CPATH=$CPATH:/usr/include/glib-2.0/ export CPATH=$CPATH:/usr/lib/glib-2.0/include/ export CPATH=$CPATH:/usr/include/pango-1.0/ export CPATH=$CPATH:/usr/lib/gtk-2.0/include/ export CPATH=$CPATH:/usr/include/atk-1.0/
用Fedora> = 25:
export CPATH=$CPATH:/usr/include/gtk-3.0 export CPATH=$CPATH:/usr/include/glib-2.0/ export CPATH=$CPATH:/lib64/glib-2.0/include/ export CPATH=$CPATH:/usr/include/pango-1.0/ export CPATH=$CPATH:/usr/lib64/gtk-3.0/3.0.0/ export CPATH=$CPATH:/usr/include/atk-1.0/ export CPATH=$CPATH:/usr/include/cairo/
放入~/.bashrc
或放入~/.zshrc
请记住运行: source ~/.bashrc
我也从Python移植到C ++,我只是不使用C ++包含工作方式。 下面是我在C ++中简化生活的方法。 我使用以下内容创建一个Makefile:
all: g++-5 main.cpp -o main `pkg-config --libs --cflags gtkmm-3.0`
包含所有*.cpp
文件和headers
,而不是main.cpp
。 (另外,请注意我使用的是gtkmm-3.0)而在gtkmm-3.0中,你的应用程序只有一个窗口,一个按钮和一个按钮被链接到一个函数[它说:Hello World! 当然]看起来像这样
#include <iostream> #include <gtkmm/application.h> #include <gtkmm/window.h> #include <gtkmm/button.h> class HelloWorld : public Gtk::Window{ public: HelloWorld(); virtual ~HelloWorld(); protected: //Signal handlers: void on_button_clicked(); //Member widgets: Gtk::Button m_button; }; // implementing the class HelloWorld HelloWorld::HelloWorld(): m_button("Click me, Xweque"){ set_border_width(20); // Sets the border width of the window. // Connecting the button's clicked signal to an arbitrary function m_button.signal_clicked().connect(sigc::mem_fun(*this, &HelloWorld::on_button_clicked)); add(m_button); m_button.show(); } HelloWorld::~HelloWorld() { } void HelloWorld::on_button_clicked(){ std::cout << "Hello World" << std::endl; } int main(int argc, char** argv){ Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.gtkmm.example"); HelloWorld mywindow; app->run(mywindow); return 0; }