版本为centos7 + gtk3.0
初次使用:gg.c:
编译:
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’未声明(在此函数内第一次使用)
去/usr/include目录下会发现,gtk/gtk.h在gtk3.0目录下,但是如果把包含头文件的语句改为#include"gtk-3.0/gtk/gtk.h" ,这样错误更多了,因为gtk.h中包含了很多其他的文件。
需要指定库文件,
一般来说,如果库的头文件不在 /usr/include 目录中,那么在编译的时候需要用 -I参数指定其路径。由于同一个库在不同系统上可能位于不同的目录下,用户安装库的时候也可以将库安装在不同的目录下,所以即使使用同一个库,由于库的路径的不同,造成了用 -I 参数指定的头文件的路径也可能不同,其结果就是造成了编译命令界面的不统一。如果使用 -L参数,也会造成连接界面的不统一。编译和连接界面不统一会为库的使用带来麻烦。
为了解决编译和连接界面不统一的问题,人们找到了一些解决办法。其基本思想就是:事先把库的位置信息等保存起来,需要的时候再通过特定的工具将其中有用的信息提取出来供编译和连接使用。这样,就可以做到编译和连接界面的一致性。其中,目前最为常用的库信息提取工具就是下面介绍的pkg-config。在默认情况下,每个支持pkg-config 的库对应的 .pc 文件在安装后都位于安装目录中的 lib/pkgconfig 目录下
cat /usr/local/spice-gtk/lib/pkgconfig/spice-client-gtk-3.0.pc
prefix=/usr/local/spice-gtk
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
Name: spice-client-gtk-3.0
Description: SPICE Client Gtk 3.0 library
Version: 0.33
Requires: gtk+-3.0 >= 3.12 spice-client-glib-2.0
Libs: -L${libdir} -lspice-client-gtk-3.0
Cflags: -I${includedir}/spice-client-gtk-3.0
使用 pkg-config 的 --cflags 参数可以给出在编译时所需要的选项,而 --libs参数可以给出连接时的选项。
所以上面程序的编译命令 应改为:
gcc gg.c -o gg `pkg-config --cflags --libs gtk+-3.0`
注意这个`
注意:程序中的头文件应该是:gtk/gtk.h,而非 gtk-2.0/gtk/gtk.h
这次终于编译成功了