pkg-config命令使用
pkg-config
是在編譯應用程式和庫時使用的輔助工具。它可以幫助您在命令列中插入正確的編譯器選項,以便應用程式可以使用 gcc -o test test.c pkg-config --libs --cflags glib-2.0
,而不是在何處找到glib(或其他庫)的硬編碼值。這是語言無關的,所以它可以用於定義文件工具的位置。
概念
pkg-config的主要用途是提供編譯和連結程式到庫的必要細節。此元資料儲存在pkg-config檔案中。這些檔案具有後綴 .pc並且駐留在pkg-config工具已知的特定位置
prefix=/usr/local
exec_prefix=${prefix}
includedir=${ prefix}/include
libdir=${exec_prefix}/lib
Name: foo
Description: The foo library
Version: 1.0.0
Cflags: -I${includedir}/foo
Libs: -L${libdir} -lfoo
各引數的意義:
Name: 庫或軟體包的可讀名稱
Description: 簡要說明
URL: 一個網址,人們可以獲取更多的資訊和下載包
Version: 專門定義包的版本的字串
Requires: 此包所需的包的列表。可以使用比較運算子=,<,>,<=或> =來指定這些包的版本(依賴關係)
Requires.private: 該包所需的私有包的列表,但不暴露於應用程式。
Conflicts: 描述與此衝突的軟體包的可選欄位
Cflags: 該包的特定編譯器標誌以及不支援pkg-config的所有庫。如果所需的庫支援pkg-config,則應將其新增到 Requires或Requires.private
Libs: 特定於此程式包的連結標誌以及不支援pkg-config的所有庫
編寫pkg-config檔案
當為一個包建立pkg-config檔案時,首先需要決定如何分發它們。每個檔案最好用於描述單個庫,因此每個包應至少與安裝庫一樣多的 pkg-config檔案。
特點:
- pkg-config檔案最好每個檔案對應一個庫檔案。
包名通常通過pkg-config元資料檔案的名稱來確定,.pc字尾的檔名稱和庫的名稱相匹配。
例如:
libfoo.so
的軟體包 將具有一個包含pkg-config元資料的對應libfoo.pc
檔案Name
,Description
和URL
是純資訊描述容易新增,version
比較棘手,要確保使用者資料使用。Requires
,Requires.private
,Cflags
,Libs
和Libs.private
將定義外部專案使用的元資料的編譯和連結庫
Requires
, Requires.private
都是確定依賴關係的,Requires連結的庫檔案會暴露出來,Requires.private
依賴的靜態的連結庫。
libs
使用該庫的連結標誌
Cflags
使用庫的編譯器標誌
使用pkg-config
系統兩個模組foo和bar,pc檔案如下:
foo.pc:
prefix=/usr
exec_prefix=${prefix}
includedir=${prefix}/include
libdir=${exec_prefix}/lib
Name: foo
Description: The foo library
Version: 1.0.0
Cflags: -I${includedir}/foo
Libs: -L${libdir} -lfoo
bar.pc:
prefix=/usr
exec_prefix=${prefix}
includedir=${prefix}/include
libdir=${exec_prefix}/lib
Name: bar
Description: The bar library
Version: 2.1.2
Requires.private: foo >= 0.7
Cflags: -I${includedir}
Libs: -L${libdir} -lbar
–modversion 顯示版本號
$ pkg-config --modversion foo
1.0.0
$ pkg-config --modversion bar
2.1.2
–libs 列印每個模組所需的連結標誌
$ pkg-config --libs foo
-lfoo
$ pkg-config --libs bar
-lbar
–static 顯示靜態連結庫
模組bar使用的lfoo庫,但是隻使用–libs沒有顯示,但是在系統呼叫的使用在libdir下查詢對應的庫檔案。
$ pkg-config --libs --static bar
-lbar -lfoo
輸出所有的cflags
$ pkg-config --cflags bar
-I/usr/include/foo
$ pkg-config --cflags --static bar
-I/usr/include/foo
–exists 檢視模組的可用性
$ pkg-config --exists foo
$ echo $?
0
依賴模組版本檢查
$ pkg-config --libs "bar >= 2.7"
Requested 'bar >= 2.7' but version of bar is 2.1.2
–print-errors 列印詳細的結果
$ pkg-config --exists --print-errors xoxo
Package xoxo was not found in the pkg-config search path.
Perhaps you should add the directory containing `xoxo.pc'
to the PKG_CONFIG_PATH environment variable
No package 'xoxo' found
pkg-config命令的環境變數
PKG_CONFIG_PATH
是pkg-config的查詢路徑,在unix系統中查詢路徑為/usr/lib/pkgconfig
和/usr/share/pkgconfig
但是有的安裝在/usr/lib
目錄下,所以最好提前制定好環境變數
$ pkg-config --modversion hello
```
Package hello was not found in the pkg-config search path.
Perhaps you should add the directory containing `hello.pc'
to the PKG_CONFIG_PATH environment variable
No package 'hello' found
```
$ export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
$ pkg-config --modversion hello
1.0.0