一、 pkg-config簡(jiǎn)介
1疫粥、關(guān)于pkg-config工具下面這篇博客有個(gè)簡(jiǎn)單的介紹,鏈接如下:
2地来、pkg-config軟件官網(wǎng):http://www.freedesktop.org/wiki/Software/pkg-config/
二的诵、最近在看glib、dbus匪补、gtk的一些例子程序伞辛,在編譯程序時(shí)經(jīng)常找不到頭文件和庫(kù)文件路徑烂翰。并且使用cmake進(jìn)行rpm打包和編譯時(shí)會(huì)使用到pkg-config這個(gè)實(shí)用的工具。
pkg-config能根據(jù)軟件安裝時(shí)軟件的.pc配置文件路徑找到相應(yīng)的頭文件路徑和庫(kù)文件路徑蚤氏,如我的ubuntu12.04下默認(rèn)安裝glib-2.0后在 /usr/lib/i386-linux-gnu/pkgconfig/
路徑下有g(shù)lib-2.0.pc,其內(nèi)容如下:
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
根據(jù)glib-2.0.pc文件的描述我們可以看到使用sudo apt-get install glib-2.0后glib-2.0的各個(gè)文件存放路徑如下:
可執(zhí)行文件安裝路徑:/usr
.h頭文件安裝路徑為:/usr/include/glib-2.0和/usr/lib/i386-linux-gnu/glib-2.0/include
.so庫(kù)文件安裝路徑為:/usr/lib/i386-linux-gnu
三刽酱、在ubuntu12.04下安裝好glib-2.0和gtk+-2.0后,下面來(lái)看兩個(gè)例子瞧捌。
1、一個(gè)使用了glib庫(kù)的簡(jiǎn)單程序hello.c润文,代碼如下:
//hello.c
#include <glib.h>
int main(int argc, char *argv[])
{
g_print("welcome to glib programming world!\n");
return 0;
}
打開(kāi)終端姐呐,輸入gcc -o hello hello.c pkg-config --cflags --libs glib-2.0
(注意:此處不是單引號(hào),而是鍵盤(pán)左邊數(shù)字鍵'1'左側(cè)典蝌、Tab鍵上側(cè)的[`])曙砂,千萬(wàn)別弄錯(cuò)哦!)
ccf@ccf-F81Se:~/WorkPlace/Glib庫(kù)學(xué)習(xí)$ gcc -o hello hello.c `pkg-config --cflags --libs glib-2.0`
ccf@ccf-F81Se:~/WorkPlace/Glib庫(kù)學(xué)習(xí)$ ls
dbus-glib示例說(shuō)明.ppt glib-2.34.3-docs glib-notes.tar.gz GLIB 庫(kù)簡(jiǎn)介 ~ GmainLoop.c~ loop Thread_Pools_glib.pdf
Event_loop.html glib-2.34.3.tar.xz Glib庫(kù)的安裝和編譯? gmain_demo.c~ hello loop.c 理解pkg-config工具
glib-2.34.3 glib-notes GLIB 庫(kù)簡(jiǎn)介 GmainLoop.c hello.c makefile 理解pkg-config工具~
ccf@ccf-F81Se:~/WorkPlace/Glib庫(kù)學(xué)習(xí)$ ./hello
welcome to glib programming world!
ccf@ccf-F81Se:~/WorkPlace/Glib庫(kù)學(xué)習(xí)$
2骏掀、一個(gè)簡(jiǎn)單的gtk程序
/*
*File name: gtkbase.c
*/
//#include <gtk-2.0/gtk/gtk.h>
#include <gtk/gtk.h>
//#include <gtk.h> //使用此路徑會(huì)編譯失敗鸠澈,找不到頭文件!
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
ccf@ccf-F81Se:~/WorkPlace/gtk$ ls
GTK2.0 編譯問(wèn)題 gtkbase.c makefile threadloop.c
GTK2.0 編譯問(wèn)題 ~ 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
[圖片上傳中...(image-2427e9-1603718060970-1)]
為了簡(jiǎn)單起見(jiàn)截驮,可以寫(xiě)一個(gè)簡(jiǎn)單的makefile文件笑陈,這樣的話(huà)每次編譯只需改動(dòng)很少的部分就行了,在終端鍵入make或make clean就OK了葵袭。
#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)