pkg-config工具的使用

2019-04-23 16:50:54 浏览数 (1)

一、 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)

0 人点赞