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,不管它在哪裡,編譯都是正常的。這是不是簡單很多了?
相關文章
- SQL最佳化好助手:RunstatsSQL
- Makefile
- Ansible,運維人員的好助手。運維
- 【Makefile】5-Makefile變數的基礎變數
- Makefile筆記筆記
- makefile 詳解
- makefile快速入門
- makefile之overrideIDE
- makefile 簡明教程
- Makefile學習(一)
- makefile筆記(2)筆記
- 使用makefile編譯編譯
- Makefile使用教程1
- makefile檔案案例
- Makefile學習之路(2) — Makefile的變數和萬用字元變數字元
- CMakeFile.txt透過sysroot方式後生成makefile報錯
- 技術分享| 排程平臺的好助手-快對講
- Makefile學習筆記筆記
- 初識makefile結構
- udp測試程式 + makefileUDP
- Makefile 讀書筆記筆記
- Makefile例項學習
- makefile =和:=的區別
- cmake Makefile面試問題面試
- Makefile之大型工程專案子目錄Makefile的一種通用寫法
- IE裡的探索之定製瀏覽器好助手(下) (轉)瀏覽器
- C編譯: makefile基礎編譯
- Makefile基本規則和原理
- 11 個 Makefile 實戰技巧
- 羽夏 MakeFile 簡明教程
- Makefile檔案是什麼?
- Makefile-4-書寫命令
- C 編譯: makefile 基礎編譯
- 使用go指令碼代替makefileGo指令碼
- golang 構建工具之 MakefileGolang
- Makefile中幾種賦值(= := ?= +=)賦值
- Makefile和GCC日常用法GC
- makefile中的shell語法