1. 程式人生 > >pkg-config使用

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