天天看點

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,不管它在哪裡,編譯都是正常的。這是不是簡單很多了?

本文轉自 h2appy  51CTO部落格,原文連結:http://blog.51cto.com/h2appy/986591,如需轉載請自行聯系原作者

繼續閱讀