一、 pkg-config简介
1、关于pkg-config工具下面这篇博客有个简单的介绍,链接如下:
理解 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,其内容如下:
代码语言:javascript复制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
根据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,代码如下:
代码语言:javascript复制//hello.c
#include <glib.h>
int main(int argc, char *argv[])
{
g_print("welcome to glib programming world!n");
return 0;
}
打开终端,输入gcc -o hello hello.c `pkg-config --cflags --libs glib-2.0`(注意:此处不是单引号,而是键盘左边数字键'1'左侧、Tab键上侧的[`]),千万别弄错哦!)
代码语言:javascript复制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库学习$
2、一个简单的gtk程序
代码语言:javascript复制/*
*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;
}
在终端编译敲如命令:gcc gtkbase.c -o gtkbase `pkg-config --cflags --libs gtk -2.0 gthread-2.0`
代码语言:javascript复制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
为了简单起见,可以写一个简单的makefile文件,这样的话每次编译只需改动很少的部分就行了,在终端键入make或make clean就OK了。
代码语言:javascript复制#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)