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

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, DescriptionURL 是純資訊描述容易新增,version比較棘手,要確保使用者資料使用。

  • Requires, Requires.private, Cflags, LibsLibs.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
$ 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

參考連結

指導文件