1、pkg-config工具的作用
pkg-config簡單的說就是向使用者提供相應庫的路徑,版本號,標頭檔案路徑等資訊的綜合呼叫程式。筆者使用的是ubuntu系統,我們以openexr庫為例看看pkg-config執行的結果,在shell命令列輸入:
顯示資訊為:-i/usr/include/openexr -lilmimf -limath -lhalf -liex -liexmath -lilmthread -lpthread
這是什麼呀?
-i/usr/include/openexr這不就是我們用gcc編譯時的cflags引數嗎?
-lilmimf -limath -lhalf -liex -liexmath -lilmthread -lpthread這些不就是gcc在鏈結時使用的ldflags引數嗎?
因此當我們需要在自己的工程中編譯鏈結時只需要合理的使用pkg-config工具,把上面那些引數加入到gcc的引數裡即可,這個就是pkg-config工具的核心作用,它會檢查你的庫,產生相應資訊,為你整合某個第三方庫提供便利。
2、*.pc檔案解析
我們知道,第三方庫的使用主要涉及標頭檔案的路徑設定,庫的路徑設定以及動態庫的環境變數設定。一般來講,第三方庫都會提供乙個*.pc
檔案,pkg-config程式通過讀取這個*.pc
的檔案,獲取了庫的標頭檔案位置和庫的路徑等資訊,然後告知編譯器,實現庫的自動使用。一般來說,*.pc
檔案的大體內容如下格式(以筆者最近使用的sqlite3為例):
其中,
3、如何編譯鏈結到你的工程?
這裡講的是工程,我只講乾貨,編譯單個程式例子網上有很多,就不贅述了。
這裡注意,使用pkg-config工具提取庫的編譯和鏈結引數需要有兩個基本前提:
1)庫本身按章的時候必須提供乙個.pc檔案。沒有這個檔案的說明庫不支援pkg-config工具;
2)pkg-config必須要知道去哪找.pc檔案;
對於支援pkg-config工具的庫來說,庫檔案的搜尋路徑實際就是對.pc檔案的搜尋路徑,一般系統的預設搜尋路在/usr/lib/pkgconfig 中,庫的標頭檔案一般在/usr/include中。而個人使用的第三方庫,不能每次編譯後都裝到/usr目錄下吧。所以私有工程在編譯鏈結第三方庫時可以通過環境變數pkg_config_path來設定,pkg-config工具將按照設定路徑的先後順序進行搜尋,直到找到指定的.pc檔案為止。
所以在私有工程的makefile中,先修改環境變數:
export pkg_config_path=/home/水笙/sqlite-autoconf-3130000/build_result/lib/pkgconfig:$pkg_config_path
環境變數設定好後,設定cflags:
cflags += `pkg-config --cflags sqlite3`
這裡注意要用``將命令包起來。
然後設定ldflags:
ldflags += `pkg-config --libs sqlite3`
基本通過這三步,工程就可以正確的編譯鏈結第三方庫了。
4、執行時指明共享庫搜尋路徑
我們知道,庫分為靜態庫和共享庫。靜態庫.a就是一些.o檔案的集合,編譯鏈結後就整合到了你的應用程式中。而共享庫,是在程式執行的時才被使用的,其搜尋路徑是在系統中預先設定的,對於處於搜尋路勁之外的庫,使用的時候必須設定好環境變數
ld_library_path,否則應用程式找不到,筆者將sqlite3庫放到了應用程式資料夾的./lib中,在啟動應用前呼叫下面這句:
export ld_library_path="./lib"
筆者建議,最好將其寫在你的啟動指令碼裡。
pkg config工具包程式編譯中的使用
當程式依賴的外部庫檔案和標頭檔案相對比較多時,每次建立工程都需要對這些庫檔案進行配置,這個過程比較繁瑣,所以pkg config工具包被開發出來,解決這乙個問題。本文主要介紹如何使用pkg config工具包,並給出opencv和armadillo軟體庫才用pkg config配置的例子。本文實在u...
JMeter BeanShell在實際測試中的應用
beanshell最常用的場景 beanshell除了可以import外部jar包外,還有乙個十分好用的特性,就是可以可以引用外部beanshell指令碼。aa bb cc scripta.bsh void printinfo scriptb.bsh source aa bb cc scripta....
Hadoop MapReduce在實際場景中的優化
mapreduce程式效率瓶頸 cpu 記憶體 磁碟健康 網路 資料傾斜 map和reduce數設定不合理 map執行時間太長,導致reduce等待太久 小檔案過多 大量的不可分塊的超大檔案 spill次數過多 merge次數過多 mapreduce優化方法主要從六個方面考慮 資料輸入 map階段 ...