Makefile好助手:pkgconfig

李先靜發表於2020-04-06

你在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.0pc檔案內容如下:

 

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

 

相關文章