pkg-config工具在实际工程中的用法
生活随笔
收集整理的這篇文章主要介紹了
pkg-config工具在实际工程中的用法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在如今這個開源的環境里,想要開發某個功能,我們都會下意識的上網搜索有沒有開源庫,如果有開源庫,那么好,下載下來給它編譯好,使用。但是在使用過程中,你是否遇到不知如何將第三方庫編譯,鏈接到自己的工程中?怎么改makefile就是改不好?是否看到開源庫lib/中pkgconfig文件夾,想都沒想這是干什么用的,打開.pc文件也不知所云?那么好,今天我就總結下開源庫中pkgconfig文件夾中.pc文件的作用,以及如何用pkg-config工具將開源庫集成到自己的工程中去。
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文件解析
? ? 我們知道,第三方庫的使用主要涉及頭文件的路徑設置,庫的路徑設置以及動態庫的環境變量設置。一般來講,第三方庫都會提供一個
? ? 這里講的是工程,我只講干貨,編譯單個程序例子網上有很多,就不贅述了。這里注意,使用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"
筆者建議,最好將其寫在你的啟動腳本里。
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為例):
其中,
prefix一般是指定庫的默認安裝路徑exec_prefix一般是指庫的另外指定的安裝路徑inludedir指定庫的頭文件路徑libdir指定庫的lib文件的路徑Name指定庫的名稱,比如筆者使用的SQLite數據庫Description表示庫的描述Version是版本號Cflags是gcc鏈接頭文件的指令,以-I緊接頭文件路徑設置Libs是gcc鏈接lib文件的指令, 是-L緊接lib文件路徑,-l緊接所使用的lib的名字。
? ? 這里講的是工程,我只講干貨,編譯單個程序例子網上有很多,就不贅述了。這里注意,使用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工具在实际工程中的用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 天谕手游朱雀神符怎么获得?
- 下一篇: 求一个好听的海洋名字