你在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,不管它在哪裡,編譯都是正常的。這是不是簡單很多了?
本文轉自 h2appy 51CTO部落格,原文連結:http://blog.51cto.com/h2appy/986591,如需轉載請自行聯系原作者