一、 pkg-config简介
1、关于pkg-config工具下面这篇博客有个简单的介绍,链接如下:
2、pkg-config软件官网:http://www.freedesktop.org/wiki/Software/pkg-config/
二、最近在看glib、dbus、gtk的一些例子程序,在编译程序时经常找不到头文件和库文件路径。并且使用cmake进行rpm打包和编译时会使用到pkg-config这个实用的工具。
pkg-config能根据软件安装时软件的.pc配置文件路径找到相应的头文件路径和库文件路径,如我的ubuntu12.04下默认安装glib-2.0后在 /usr/lib/i386-linux-gnu/pkgconfig/
路径下有glib-2.0.pc,其内容如下:
- <span style="font-size:14px;">prefix=/usr
- exec_prefix=${prefix}
- libdir=${prefix}/lib/i386-linux-gnu
- includedir=${prefix}/include
- glib_genmarshal=glib-genmarshal
- gobject_query=gobject-query
- glib_mkenums=glib-mkenums
- Name: GLib
- Description: C Utility Library
- Version: 2.32.3
- Requires.private: libpcre
- Libs: -L${libdir} -lglib-2.0
- Libs.private: -pthread -lrt -lpcre
- Cflags: -I${includedir}/glib-2.0 -I${libdir}/glib-2.0/include </span>
根据glib-2.0.pc文件的描述我们可以看到使用sudo apt-get install glib-2.0后glib-2.0的各个文件存放路径如下:
可执行文件安装路径:/usr
.h头文件安装路径为:/usr/include/glib-2.0和/usr/lib/i386-linux-gnu/glib-2.0/include
.so库文件安装路径为:/usr/lib/i386-linux-gnu
三、在ubuntu12.04下安装好glib-2.0和gtk+-2.0后,下面来看两个例子。
1、一个使用了glib库的简单程序hello.c,代码如下:
- <span style="font-size:14px;">//hello.c
- #include <glib.h>
- int main(int argc, char *argv[])
- {
- g_print("welcome to glib programming world!\n");
- return 0;
- }</span>
打开终端,输入 gcc -o hello hello.c `pkg-config --cflags --libs glib-2.0`(注意:此处不是单引号,而是键盘左边数字键'1'左侧、Tab键上侧的[`]),千万别弄错哦!)
- <span style="font-size:14px;">ccf@ccf-F81Se:~/WorkPlace/Glib库学习$ gcc -o hello hello.c `pkg-config --cflags --libs glib-2.0`
- ccf@ccf-F81Se:~/WorkPlace/Glib库学习$ ls
- dbus-glib示例说明.ppt glib-2.34.3-docs glib-notes.tar.gz GLIB 库简介 ~ GmainLoop.c~ loop Thread_Pools_glib.pdf
- Event_loop.html glib-2.34.3.tar.xz Glib库的安装和编译? gmain_demo.c~ hello loop.c 理解pkg-config工具
- glib-2.34.3 glib-notes GLIB 库简介 GmainLoop.c hello.c makefile 理解pkg-config工具~
- ccf@ccf-F81Se:~/WorkPlace/Glib库学习$ ./hello
- welcome to glib programming world!
- ccf@ccf-F81Se:~/WorkPlace/Glib库学习$
- </span>
2、一个简单的gtk程序
- <span style="font-size:14px;">/*
- *File name: gtkbase.c
- */
- //#include <gtk-2.0/gtk/gtk.h>
- #include <gtk/gtk.h>
- //#include <gtk.h> //使用此路径会编译失败,找不到头文件!
- int main(int argc,char* argv[])
- {
- GtkWidget *wnd;
- gtk_init(&argc,&argv);
- wnd=gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_widget_show(wnd);
- gtk_main();
- return 0;
- }</span>
在终端编译敲如命令:gcc gtkbase.c -o gtkbase `pkg-config --cflags --libs gtk+-2.0 gthread-2.0`
- <span style="font-size:14px;">ccf@ccf-F81Se:~/WorkPlace/gtk$ ls
- GTK2.0 编译问题 gtkbase.c makefile threadloop.c
- GTK2.0 编译问题 ~ gtkbase.c~ threadloop
- ccf@ccf-F81Se:~/WorkPlace/gtk$ gcc gtkbase.c -o gtkbase `pkg-config --cflags --libs gtk+-2.0 gthread-2.0`
- ccf@ccf-F81Se:~/WorkPlace/gtk$ ./gtkbase </span>
为了简单起见,可以写一个简单的makefile文件,这样的话每次编译只需改动很少的部分就行了,在终端键入make或make clean就OK了。
- <span style="font-size:14px;">#makefile for gtkbase
- APP_NAME=gtkbase
- CC=gcc
- RM=-rm -f
- LIBS=`pkg-config --cflags --libs gtk+-2.0 gthread-2.0`
- $(APP_NAME):$(APP_NAME).c
- gcc $< -o $@ $(LIBS)
- .PHNOY:clean
- clean:
- $(RM) *.o $(APP_NAME)</span>