Makefile好助手:pkgconfig
你在Unix下開發過軟體嗎?寫完一個程式,編譯執行完全正常,在你本機上工作得好好的,你放到原始碼管理系統中。然後,告訴你的同事說,你可以取下來用了。這時,你長長的出了一口氣,幾天的工作沒有白費,多麼清新的空氣啊,你開始飄飄然了。
“Hi,怎麼編譯不過去?”你還沉浸在那種美妙的感覺之中,雙臂充滿著力量,似乎沒有什麼問題能難倒你的。正在此時,那個笨蛋已經衝著你嚷開了。
“不會吧,我這邊好好的!”表面上你說得很客氣,其實,你心裡已經罵開了,真笨,不知道腦子幹嘛用的。也許,你想的沒錯,上次,他犯了一個簡單的錯誤,不是你一去就解決了嗎。
他喊三次之後,你不得不放下你手上的工作,剛才那種美妙的感覺已經消失得無影無蹤了,要不是你把情緒控制得很好,一肚子氣就要撒在他身上了。你走到他的電腦前,鍵入make,優雅的按下回車。怎麼可能出錯呢?你信心十足。然而,螢幕上的結果多少有點讓人臉紅,該死的,libxxx.so怎麼會讓不到呢?
你在/usr目錄中查詢libxxx.so,一切都逃不過你的眼睛。奇怪,libxxx.so怎麼在/usr/local/lib下,不是應該在/usr/lib下的嗎?這你可不能怪別人,別人想安裝在哪裡都行,下次還可能安裝到/lib目錄下呢。
以上的場景並非虛構,我都經歷過好幾次,明明在本機上好好的,在別人的機器上連編譯都過不去。可能兩人的作業系統一模一樣,需要的庫都安裝上,只是由於個人喜好不同,安裝在不同的目錄而已。遇到這種情況,每次都技巧性的繞過去了,用的補丁型的方法,心裡老惦記其它地方能不能工作。
今天我們要介紹的pkgconfig,為解決以上問題提供了一個優美方案。從此,你再也不為此擔憂了。Pkgconfig提供了下面幾個功能:
1. 檢查庫的版本號。如果所需要的庫的版本不滿足要求,它會列印出錯誤資訊,避免連結錯誤版本的庫檔案。
2. 獲得編譯預處理引數,如巨集定義,標頭檔案的位置。
3. 獲得連結引數,如庫及依賴的其它庫的位置,檔名及其它一些連線引數。
4. 自動加入所依賴的其它庫的設定。
這一切都自動的,庫檔案安裝在哪裡都沒關係!
在使用前,我們說說pkgconfig的原理,pkgconfig並非精靈,可以憑空得到以上資訊。事實上,為了讓pkgconfig可以得到這些資訊,要求庫的提供者,提供一個.pc檔案。比如gtk+-2.0的pc檔案內容如下:
prefix=/usr
exec_prefix=/usr
libdir=/usr/lib
includedir=/usr/include
target=x11
gtk_binary_version=2.4.0
gtk_host=i386-redhat-linux-gnu
Name: GTK+
Description: GIMP Tool Kit (${target} target)
Version: 2.6.7
Requires: gdk-${target}-2.0 atk
Libs: -L${libdir} -lgtk-${target}-2.0
Cflags: -I${includedir}/gtk-2.0
這個檔案一般放在/usr/lib/pkgconfig/或者/usr/local/lib/pkgconfig/裡,當然也可以放在其它任何地方,如像X11相關的pc檔案是放在/usr/X11R6/lib/pkgconfig下的。為了讓pkgconfig可以找到你的pc檔案,你要把pc檔案所在的路徑,設定在環境變數PKG_CONFIG_PATH裡。
使用方法很簡單,比如,我們要使用gtk+的庫編譯一個程式:
gcc -g arrow.c -o arrow `pkg-config "gtk+-2.0 > 2.0.0" --cflags --libs`
只要安裝了gtk+2.0,不管它在哪裡,編譯都是正常的。這是不是簡單很多了?
相關文章
- Ansible,運維人員的好助手。運維
- Makefile
- 【Makefile】5-Makefile變數的基礎變數
- makefile之overrideIDE
- makefile規則
- 技術分享| 排程平臺的好助手-快對講
- 使用makefile編譯編譯
- Makefile使用教程1
- makefile 簡明教程
- Makefile學習(一)
- makefile檔案案例
- makefile快速入門
- Makefile學習之路(2) — Makefile的變數和萬用字元變數字元
- 16.Makefile約定
- makefile =和:=的區別
- Makefile學習筆記筆記
- 初識makefile結構
- Makefile例項學習
- Makefile基本規則和原理
- C編譯: makefile基礎編譯
- 11 個 Makefile 實戰技巧
- Makefile-4-書寫命令
- 跟我一起寫Makefile
- Error in invoking target 'agent nmhs' of makefileError
- Makefile與Shell的問題
- makefile中的偽目標
- cmake Makefile面試問題面試
- makefile 知識點小結
- golang 構建工具之 MakefileGolang
- Makefile中:=, =, ?=和+=的含義
- 使用 makefile 管理 docker-composeDocker
- 羽夏 MakeFile 簡明教程
- Makefile檔案是什麼?
- Makefile-3-書寫規則
- makefile從入門到入門
- Makefile引用與環境變數變數
- 16.Linuxshell程式設計(Makefile)Linux程式設計
- Makefile 一步入門