我的机子是 centos6.4 系统的,装gtk 版本是:
pkg-config gtk+-2.0 --modversion
显示 为 :2.18.9
然后开始测试程序 : hello world
vi gg.c
#include
int main (int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *label;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), "Hello World");
g_signal_connect (window, "destroy",
G_CALLBACK (gtk_main_quit), NULL);
label = gtk_label_new ("Hello, World");
gtk_container_add (GTK_CONTAINER (window), label);
gtk_widget_show_all (window);
gtk_main ();
return 0;
}
gcc -o gg gg.c
gg.c:1:22: 错误:gtk/gtk.h:没有那个文件或目录
gg.c: 在函数‘main’中:
gg.c:4: 错误:‘GtkWidget’未声明(在此函数内第一次使用)
gg.c:4: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其
gg.c:4: 错误:所在的函数内也只报告一次。)
gg.c:4: 错误:‘window’未声明(在此函数内第一次使用)
gg.c:5: 错误:‘label’未声明(在此函数内第一次使用)
gg.c:8: 错误:‘GTK_WINDOW_TOPLEVEL’未声明(在此函数内第一次使用)
gg.c:11: 错误:‘gtk_main_quit’未声明(在此函数内第一次使用)
gg.c:11: 错误:‘NULL’未声明(在此函数内第一次使用)
编译老是说找不到gtk/gtk.h文件,查了下,其实这个文件是在/usr/include/gtk-2.0/gtk/gtk.h中,于是我把包含头文件的语句改为#include
一般来说,如果库的头文件不在 /usr/include 目录中,那么在编译的时候需要用 -I参数指定其路径。由于同一个库在不同系统上可能位于不同的目录下,用户安装库的时候也可以将库安装在不同的目录下,所以即使使用同一个库,由于库的路径的不同,造成了用 -I 参数指定的头文件的路径也可能不同,其结果就是造成了编译命令界面的不统一。如果使用 -L参数,也会造成连接界面的不统一。编译和连接界面不统一会为库的使用带来麻烦。
为了解决编译和连接界面不统一的问题,人们找到了一些解决办法。其基本思想就是:事先把库的位置信息等保存起来,需要的时候再通过特定的工具将其中有用的信息提取出来供编译和连接使用。这样,就可以做到编译和连接界面的一致性。其中,目前最为常用的库信息提取工具就是下面介绍的pkg-config。在默认情况下,每个支持pkg-config 的库对应的 .pc 文件在安装后都位于安装目录中的 lib/pkgconfig 目录下,查看一下
cat /usr/lib/pkgconfig/gtk+-2.0.pc
prefix=/usr
exec_prefix=/usr
libdir=/usr/lib
includedir=/usr/include
target=x11
gtk_binary_version=2.10.0
gtk_host=i386-redhat-linux-gnu
Name: GTK+
Description: GTK+ Graphical UI Library (${target} target)
Version: 2.18.9
Requires: gdk-${target}-2.0 atk cairo gio-2.0 pangoft2
Libs: -L${libdir} -lgtk-${target}-2.0
Cflags: -I${includedir}/gtk-2.0
所以上面程序的编译命令 应改为:
gcc gg.c -o gg `pkg-config --cflags --libs gtk+-2.0`
这次终于编译成功了
运行下: ./gg
郁闷,又出现错误:
No protocol specified
(gedit:14333): Gtk-WARNING **: cannot open display: :0.0
xhost +
最后不管是在一般用户 还是root用户下,都可执行成功了。
成功后便会出现一个 hello world 的窗口。