pkg-config使用
1 pkg-config介紹
pkg-config用來檢索系統中安裝庫檔案的資訊。典型的是用作庫的編譯和連線。如在Makefile中:
program: program.c cc program.c `pkg-config --cflags --libs gnomeui` |
pkg-config --list-all 可以列出所有可使用的包。
pkg-config要求庫提供一個.pc元資料檔案,從這些檔案中檢索庫的各種必要資訊,包括版本資訊,編譯和連線需要的引數等。這些資訊可以通過pkg-config提供的引數(如--cflags, --libs)單獨提取出來直接供編譯器和聯結器使用。
預設情況下,每個支援pkg-config的庫對應的.pc檔案,在安裝後,都位於目錄/usr/lib/pkgconfig目錄下。自己新增的三方庫集合,應注意把對應點.pc檔案拷貝到預設目錄/usr/lib/pkgconfig下,是系統可以順利的找到新增的三方庫集合。
環境變數PKG_CONFIG_PATH是用來設定.pc檔案的搜尋路徑的,pkg-config按照設定路徑的先後順序進行搜尋。這樣,庫的標頭檔案的搜尋路徑的設定實際上就變成了對.pc檔案搜尋路徑的設定。
2 pkg-config功能
一般來說,即使是使用同一個庫,不同的使用者在安裝時也可能會安裝在不同的目錄下。這樣在編譯時使用-I引數指定include路徑,在連線時使用-L引數指定lib庫的路徑,可能造成了編譯,連線的不一致,同一份程式從一臺機器copy到另一臺機器時就可能會出現問題。
pkg-config就是用來解決編譯連線介面不統一問題的一個工具。
它的基本思想:事先把庫的各種必要資訊儲存在.pc檔案中,需要的時候可以使用引數(--cflags, --libs),將所需資訊提取出來供編譯和連線使用。這樣,不管庫檔案安裝在哪,通過庫對應的.pc檔案就可以準確定位,可以使用相同的編譯和連線命令,使得編譯和連線介面統一。
它提供的主要功能有:
<1> 檢查庫的版本號。如果所需庫的版本不滿足要求,打印出錯誤資訊,避免連線錯誤版本的庫檔案。
<2> 獲得編譯預處理引數,如巨集定義,標頭檔案的路徑。
<3> 獲得編譯引數,如庫及其依賴的其他庫的位置,檔名及其他一些連線引數。
<4> 自動加入所依賴的其他庫的設定。
3 gtk+-2.0的.pc檔案內容舉例
prefix=/usr exec_prefix=/usr libdir=/usr/lib includedir=/usr/include target=x11
gtk_binary_version=2.4.0 gtk_host=i386-redhat-linux-gnu
Name: GTK+ Description: GIMP Tool Kit (${target} target) Version: 2.6.7 Requires: gdk-${target}-2.0 atk Libs: -L${libdir} -lgtk-${target}-2.0 Cflags: -I${includedir}/gtk-2.0 |
如果要使用gtk+的庫編譯一個程式,可以如下:
$gcc -c program.c -o program `pkg-config "gtk+-2.0>2.0.0" --cflags --libs` |
其中,--cflags引數提取出編譯所需的選項,--libs引數提取出連線時的選項。上面一步也可以分成兩步如下:
$gcc -c program.c `pkg-config --cflags "gtk+-2.0>2.0.0"` $gcc -o program program.o `pkg-config --libs "gtk+-2.0>2.0.0"` |
4 環境變數PKG_CONFIG_PATH
在安裝完一個需要使用的庫後,比如Glib,一是將相應的.pc檔案,如glib-2.0.pc拷貝到/usr/lib/pkgconfig目錄下,二是通過設定環境變數PKG_CONFIG_PATH新增glib-2.0.pc檔案的搜尋路徑。
尤其是不完全使用新安裝的庫取代舊庫的時候,使用環境變數可能是更好的選擇,因為環境視窗的設定只對當前終端視窗有效。
使用環境變數的方法,只需修改PKG_CONFIG_PATH和LD_LIBRARY_PATH變數。LD_LIBRARY_PATH變數主要是新增新安裝庫的搜尋路徑。
如新的Glib庫安裝在/usr/local/glib-2.0/lib下,可以編輯檔案set_glib-2.0:
export PKG_CONFIG_PATH=/usr/local/lib/glib-2.0/lib/pkgconfig:$PKG_CONFIG_PATH export LD_LIBRARY_PATH=/usr/local/lib/glib-2.0/lib:$LD_LIBRARY_PATH |
每次使用時,source下就行了:
$source set_glib-2.0 |
5 其他的config
$ls /usr/bin/*config |