我对编程很陌生,特别是涉及如何包含库和类似的活动。我过去一直使用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安装(只需要安装的软件包),并且会出现同样的错误。
答案 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;
}