gtk / gtk.h не найден на Ubuntu c++

Я довольно новичок в программировании и особенно когда дело доходит до включения библиотек и подобных мероприятий. Я немного программировал с помощью Python в прошлом, и я использовал GTK для создания windows, что я намеревался сделать при программировании с 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 (только что установленные пакеты необходимы), и возникают те же ошибки.

4 ответов


на даст вам все -I (включить) и -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


Я также иммигрировал на C++ из Python, и я просто не используется с тем, как 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;
}