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

时间:2014-07-25 12:19:18

标签: c++ c linux ubuntu g++

我对编程很陌生,特别是涉及如何包含库和类似的活动。我过去一直使用Python进行编程,并且我一直在使用GTK来创建窗口,这也是我在用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;
}

代码取自我在互联网上发现的“Hello world”示例。

我知道这个问题已经得到了答案,但我的情况要复杂得多(至少从我的角度来看)。首先,我已经安装了所有必需的包。顺便说一句,我运行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安装(只需要安装的软件包),并且会出现同样的错误。

3 个答案:

答案 0 :(得分:12)

当包含某个包时,pkgconfig命令为编译器提供了所有必需的-I(包含)和-l(链接器)语句。

看看运行时给出了什么:

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不足以提供所有必要的包含路径和共享库。

答案 1 :(得分:1)

当您没有在Ubuntu上安装文件时,要去的地方是http://packages.ubuntu.com,并使用第二个搜索表单查找文件名。

this case中,答案是(对于可信赖的):

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头文件的过程。

答案 2 :(得分:0)

我也从Python移植到C ++,我只是不习惯C ++如何包含工作方式。这就是我在C ++中让生活更轻松的方法。我使用以下内容制作一个Makefile:

all:
     g++-5 main.cpp -o main `pkg-config --libs --cflags gtkmm-3.0`

而不是main.cpp,请包含您的所有*.cpp个文件和headers。 (另外,请注意我使用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;
}