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