在Ubuntu c ++中找不到gtk / gtk.h

我对编程相当陌生,特别是在涉及到图书馆和类似活动的时候。 过去我一直在使用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,并使&#x7528;第二个搜索表单来查找文件名。

在这种情况下 ,答案是(对于可靠 ):

 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; }