日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

pkg-config工具在实际工程中的用法

發(fā)布時間:2023/11/27 生活经验 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pkg-config工具在实际工程中的用法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
在如今這個開源的環(huán)境里,想要開發(fā)某個功能,我們都會下意識的上網(wǎng)搜索有沒有開源庫,如果有開源庫,那么好,下載下來給它編譯好,使用。但是在使用過程中,你是否遇到不知如何將第三方庫編譯,鏈接到自己的工程中?怎么改makefile就是改不好?是否看到開源庫lib/中pkgconfig文件夾,想都沒想這是干什么用的,打開.pc文件也不知所云?那么好,今天我就總結(jié)下開源庫中pkgconfig文件夾中.pc文件的作用,以及如何用pkg-config工具將開源庫集成到自己的工程中去。
1、pkg-config工具的作用
? ? pkg-config簡單的說就是向用戶提供相應(yīng)庫的路徑,版本號,頭文件路徑等信息的綜合調(diào)用程序。筆者使用的是Ubuntu系統(tǒng),我們以O(shè)penEXR庫為例看看pkg-config運行的結(jié)果,在shell命令行輸入:
顯示信息為:-I/usr/include/OpenEXR -lIlmImf -lImath -lHalf -lIex -lIexMath -lIlmThread -lpthread 這是什么呀? -I/usr/include/OpenEXR 這不就是我們用gcc編譯時的CFLAGS參數(shù)嗎? -lIlmImf -lImath -lHalf -lIex -lIexMath -lIlmThread -lpthread這些不就是gcc在鏈接時使用的LDFLAGS參數(shù)嗎?
因此當(dāng)我們需要在自己的工程中編譯鏈接時只需要合理的使用pkg-config工具,把上面那些參數(shù)加入到gcc的參數(shù)里即可,這個就是pkg-config工具的核心作用,它會檢查你的庫,產(chǎn)生相應(yīng)信息,為你集成某個第三方庫提供便利。
2、*.pc文件解析
? ? 我們知道,第三方庫的使用主要涉及頭文件的路徑設(shè)置,庫的路徑設(shè)置以及動態(tài)庫的環(huán)境變量設(shè)置。一般來講,第三方庫都會提供一個*.pc?文件,pkg-config程序通過讀取這個*.pc的文件,獲取了庫的頭文件位置和庫的路徑等信息,然后告知編譯器,實現(xiàn)庫的自動使用。一般來說,*.pc文件的大體內(nèi)容如下格式(以筆者最近使用的SQLite3為例):

其中,

  • prefix一般是指定庫的默認安裝路徑
  • exec_prefix一般是指庫的另外指定的安裝路徑
  • inludedir指定庫的頭文件路徑
  • libdir指定庫的lib文件的路徑
  • Name指定庫的名稱,比如筆者使用的SQLite數(shù)據(jù)庫
  • Description表示庫的描述
  • Version是版本號
  • Cflags是gcc鏈接頭文件的指令,以-I緊接頭文件路徑設(shè)置
  • Libs是gcc鏈接lib文件的指令, 是-L緊接lib文件路徑,-l緊接所使用的lib的名字。
3、如何編譯鏈接到你的工程?
? ? 這里講的是工程,我只講干貨,編譯單個程序例子網(wǎng)上有很多,就不贅述了。這里注意,使用pkg-config工具提取庫的編譯和鏈接參數(shù)需要有兩個基本前提: 1)庫本身按章的時候必須提供一個.pc文件。沒有這個文件的說明庫不支持pkg-config工具; 2)pkg-config必須要知道去哪找.pc文件; ? ? ? 對于支持pkg-config工具的庫來說,庫文件的搜索路徑實際就是對.pc文件的搜索路徑,一般系統(tǒng)的默認搜索路在/usr/lib/pkgconfig 中,庫的頭文件一般在/usr/include中。而個人使用的第三方庫,不能每次編譯后都裝到/usr目錄下吧。所以私有工程在編譯鏈接第三方庫時可以通過環(huán)境變量PKG_CONFIG_PATH來設(shè)置,pkg-config工具將按照設(shè)置路徑的先后順序進行搜索,直到找到指定的.pc文件為止。 ? ?所以在私有工程的makefile中,先修改環(huán)境變量:
export PKG_CONFIG_PATH=/home/水笙/sqlite-autoconf-3130000/build_result/lib/pkgconfig:$PKG_CONFIG_PATH
環(huán)境變量設(shè)置好后,設(shè)置CFLAGS:
CFLAGS += `pkg-config --cflags sqlite3`
這里注意要用``將命令包起來。
然后設(shè)置LDFLAGS: LDFLAGS += `pkg-config --libs sqlite3`
基本通過這三步,工程就可以正確的編譯鏈接第三方庫了。
4、運行時指明共享庫搜索路徑
? ? 我們知道,庫分為靜態(tài)庫和共享庫。靜態(tài)庫.a就是一些.o文件的集合,編譯鏈接后就集成到了你的應(yīng)用程序中。而共享庫,是在程序運行的時才被使用的,其搜索路徑是在系統(tǒng)中預(yù)先設(shè)置的,對于處于搜索路勁之外的庫,使用的時候必須設(shè)置好環(huán)境變量LD_LIBRARY_PATH,否則應(yīng)用程序找不到,筆者將sqlite3庫放到了應(yīng)用程序文件夾的./lib中,在啟動應(yīng)用前調(diào)用下面這句:
export LD_LIBRARY_PATH="./lib"
筆者建議,最好將其寫在你的啟動腳本里。

總結(jié)

以上是生活随笔為你收集整理的pkg-config工具在实际工程中的用法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。