在 Linux 系統上源碼安裝 GTK+ 2.0
==================================================
Keywords: GTK+, Install, Linux, Source
Author: whyglinux (whyglinux AT hotmail DOT com)
Date: 2007-01-07
==================================================
目錄
0. 前言
1.
二進制安裝和源碼安裝
2.
GTK+ 依賴軟件包
3.
查看軟件的版本號
4. 安裝規劃
4.1 系統上未安裝 GTK+
4.2 系統上已安裝 GTK+
5. 軟件下載
6. 庫的安裝
6.1 安裝順序
6.2 安裝過程
6.2.1 解包
6.2.2 配置
6.2.3 構建
6.2.4 安裝
6.2.5 設置
6.2.5.1 搜索路徑
6.2.5.2 編譯和鏈接界面
6.2.5.3 pkg-config
6.2.5.4 GTK+ 及其依賴庫的設置
6.2.5.4.1 以編譯和鏈接爲目的的設置
6.2.5.4.2 以鏈接和執行爲目的的設置
6.3 其它庫的安裝
6.3.1 安裝 Atk
6.3.2 安裝 Cairo
6.3.3 安裝 Pango
6.3.4 安裝 Gtk+
7. 庫的使用
7.1 庫使用以前的設置
7.2 庫文檔
0. 前言
GTK+ 2.0 依賴的軟件包(程序和庫)比較多,版本的更新也比較頻繁,因此若是想從 GTK+ 提供的源碼軟件包中構建一套較新或最新版本的
GTK+
庫來使用的話,一般須要首先更新或者安裝一系列新版本的依賴程序或庫。同時,因爲軟件包之間存在着依賴關係,對軟件包的版本和安裝順序都有必定的要求,一
般還須要對安裝後的庫進行一些必要的設置才能使用庫。於是,能夠說源碼安裝 GTK+ 是一項不小的工程。若是沒有源碼安裝 GTK+
的經驗,在安裝過程當中很容易遇到一些問題。對於新手來講,出現了安裝問題時卻每每不知道如何去解決。
本文試圖對 GTK+ 的源碼安裝提供一套可行的解決方案,介紹一些安裝和使用庫方面的背景知識,對安裝過程當中容易出現問題的地方作了強調說明,以使安裝過程可以順利進行。這樣,即便是一個歷來沒有安裝過 GTK+ 的新手也能根據這裏的說明順利地安裝上 GTK+。
1. 二進制安裝和源碼安裝
須要首先說明的的是:對於 Linux 系統、特別是較新版本的 Linux 系統來講,其發行版中已經包含了 GTK+
和全部的支撐軟件,通常來講默認安裝後就能夠直接使用 GTK+ 了。若是在安裝的時候沒有選擇安裝 GTK+,也能夠用系統提供的安裝工具將
GTK+ 添加到系統中來,或者下載已經編譯好的 GTK+ 進行版本升級。
上面的安裝方式使用的是已經編譯好的軟件包。因爲這種安裝通常會自動解決各個軟件包之間的依賴關係,進而安裝或者更新相應的軟件包,因此與源碼安裝方式相
比,二進制包的安裝節省了編譯代碼所須要的時間,避免了源碼安裝的種種繁瑣易錯之處,對於安裝者的要求也較低,所以是安裝 GTK+ 的首選方式。
二進制安裝方式簡單快捷,但也有其力所不及的地方:一般一個軟件的二進制包的版本更新要落後於其最新版本,有些軟件也可能沒有二進制包提供。這樣,要使用
最新的版本極可能源碼安裝就是惟一能夠選擇的方式了。有時人們也想體驗或學習 GTK+
的源碼安裝方式,畢竟在開源盛世的今天,對於程序員來講源碼安裝也是必需要過的一關。
2. GTK+ 依賴軟件包
GTK+ 的安裝須要下面程序或者庫的支持(可在列出的連接中找到各個軟件包的下載地址):
php
C 編譯器(如 GCC。GCC 的網站)
html
X 窗口系統庫(網站)
linux
pkg-config 工具(網站)
程序員
GNU make 工具(網站)
shell
JPEG、PNG 以及 TIFF 圖形庫(下載頁面 的 GTK+ Source 中的 dependencies 目錄)
瀏覽器
FreeType(網站)
安全
fontconfig 庫(網站)
bash
GNU libiconv 庫(當系統上沒有 iconv() 函數的時候須要)(網站)
網絡
GNU gettext 軟件包(當系統上沒有 gettext() 函數的時候須要)([url=http://www.gnu.org/software/gettext/網站[/url])
函數
GLib 庫(下載頁面 的 GLib Source)
ATK 庫(下載頁面 的 GTK+ Source 中的 dependencies 目錄)
Cairo 庫(下載頁面 的 GTK+ Source 中的 dependencies 目錄)
Pango 庫(下載頁面 的 Pango Source)
GTK+ 庫(下載頁面 的 GTK+ Source)
目前(寫此文時)最新的 GTK+ 是 2.10.6 版,咱們就以這個版本爲例介紹。當你看到這篇文章的時候,可能 GTK+ 又有了新的版本,因此要注意下載安裝新版本的軟件包。
其中,以上 1~9 各項是一些比較通用的軟件,和 GTK+ 的關係也沒有那麼緊密--它們不但被 GTK+ 使用,也被其它程序或者庫使用。即便系統上沒有安裝 GTK+,它們也可能已經在系統中存在了。
10~13 各項和 GTK+ 關係密切,更新也較快,一般一個 GTK+ 的版本會依賴於這些庫的一些特定的版本。因爲這些緣由,在本文中說明
GTK+ 安裝的時候認爲 1~9 項已經安裝好了,因此只涉及到 10~14 項的安裝。也就是說,GTK+ 的安裝實際上主要是
GLib、Atk、Cairo、Pango 和 Gtk+ 這五個庫的安裝。
固然,在你的系統 1~9 各項中也可能存在沒有安裝的狀況,也可能存在因爲版本太低從而使 GTK+
不能順利安裝的狀況。當遇到這些狀況的時候,應該參考各自的網站中的安裝說明對軟件進行安裝或者升級。可使用二進制包直接安裝,也可使用源碼方式安
裝。在本文中對這些軟件的安裝將再也不敘述。
根據經驗,只要系統中已經有了 1~9 各項,並且系統也較新的話,爲了安裝 GTK+ 通常沒有必要把它們都升級到最新版本,除了其中的
pkg-config 工具。pkg-config 的變更較大,新版本的 GTK+ 的安裝須要新版 pkg-config
的支持,不然可能會使安裝過程失敗。所以,要在安裝 GTK+ 以前檢查 pkg-config
的版本號。若是版本太低,必定要對它進行版本更新。至於 GTK+ 安裝時對 pkg-config 的最低版本要求,能夠在 GTK+ 下載目錄的
dependencies 目錄中找到對應的 pkg-config 軟件包,從軟件包上提供的版本信息中得到確認。
3. 查看軟件的版本號
查看已經安裝的軟件的版本號的目的有二:
檢查軟件是否存在
得到軟件的版本號,從中能夠了解軟件的新舊程度,是決定軟件是否須要更新的依據
軟件包大體可分爲兩種類型:程序和庫。類型不一樣,查看版本號的方式也不一樣。
對於可運行的程序命令來講,查看版本號的方式是在執行命令後加上 --version 參數。例如,對於 pkg-config 來講,其過程是這樣的:
$ pkg-config --version
上面的「$」符號表示命令行提示符。
注:你如今應該執行上面的命令查看 pkg-config 的版本號,並按照上面所述檢查是否符合安裝相應的 GTK+ 的最低版本要求。若是不符合要求,在進行下面的 GTK+ 及其依賴庫的安裝以前應該首先安裝和更新 pkg-config。
對於庫來講,若是它支持使用 pkg-config,則可使用 pkg-config 來查看其版本號。例如,對於 GTK+ 2.0 庫來講,能夠這樣:
$ pkg-config --modversion gtk+-2.0
注:不妨執行上面的命令看看 GTK+ 庫是否已經在系統存在了;若是已經存在,注意它的版本號。還能夠執行下面的命令查看使用 GTK+ 庫時的編譯和鏈接選項:
$ pkg-config --cflags --libs gtk+-2.0
經過顯示出來的信息中的 -I 後面的路徑能夠大致知道 GTK+ 及其依賴庫的安裝位置。看看它們是否是都位於 /usr 目錄下。
4. 安裝規劃
4.1 系統上未安裝 GTK+
經過上面的檢查,若是發現系統上沒有安裝 GTK+,那問題就變得簡單了:直接將 GTK+ 及其依賴庫安裝到 /usr
目錄下便可(至於如何把各個庫的安裝目錄設置爲 /usr,可參看下面有關的安裝說明)。這樣作的好處是:因爲 /usr
是系統目錄,幾乎不須要對安裝的庫進行什麼設置就可以立刻使用它們。
/usr 是一個重要的系統目錄,應該儘可能避免對這個目錄進行寫操做。所以,建議源碼安裝 GTK+ 不要將它安裝在 /usr 等系統目錄下;可另選擇一其它目錄(具體參見下面的相關說明)。
4.2 系統上已安裝 GTK+
若是系統中已經安裝有 GTK+,要安裝新版本的 GTK+ 時須要考慮的問題就多一些了。在 Linux 系統上使用的不少軟件都是在 GTK+
庫的支持下運行的(好比 GNOME 桌面)。若是相關的 GTK+
庫發生損壞,或者庫的版本發生了變化,輕微的可形成某些程序不能正常運行,嚴重的可能會給系統運行帶來障礙(好比進入不了桌面環境,等等。)
所以,新版本的 GTK+ 的安裝應該避免對原來的 GTK+ 形成影響,以保證系統的正常運行。這一點很容易作到:新版 GTK+
的安裝目錄要避免和已經存在的 GTK+ 的目錄一致。好比,若是舊版的 GTK+ 安裝在 /usr 目錄下,新版 GTK+
在設置安裝目錄的時候最好就不要設置爲 /usr 了。
一些人因爲不瞭解這些狀況,或者圖方便,直接就把 GTK+ 安裝在 /usr 中、從而把原來的 GTK+ 庫給替換了。因爲 GTK+
及其兼容庫版本的變化以及可能在安裝過程當中產生的錯誤,很容易出現上面提到的問題,因此建議在安裝新版 GTK+ 時,最好避開舊版 GTK+
所在的目錄。
GTK+ 安裝在什麼目錄中爲好呢?其實,這沒有什麼定論,可自行設置安裝的目錄。不過,通常的源碼軟件包默認的安裝目錄是
/usr/local,因此能夠把這個目錄設置爲 GTK+ 的安裝目錄,也能夠是其它你認爲合適的目錄。在下面的示例安裝中,咱們使用的安裝目錄是
/opt/gtk,GTK+ 及其依賴庫都將安裝在這個目錄下。
將 GTK+ 及其依賴庫設置安裝到同一個目錄下(如 /opt/gtk)、而不是每個庫佔用一個不一樣的目錄,能夠給之後的庫的設置帶來方便。並且,在未來再也不須要這個版本的 GTK+ 及其依賴庫的時候能夠經過刪除這個目錄(如 /opt/gtk)將它們簡單地去除。
和安裝到 /usr 目錄中不一樣,若是將庫安裝到一個非系統目錄中(好比咱們將要使用的 /opt/gtk 目錄),只將庫安裝完成仍是不夠的,還必需要進行一些必要的設置才能使用這個新安裝好的庫。在下面的相關章節中講對庫的設置做具體說明。
5. 軟件下載
按照上面「依賴軟件包」一節中提供的說明和地址分別下載 GLib、Atk、Cairo、Pango、Gtk+ 這五個庫。
在各自的下載目錄中,一般列出了各類版本的軟件包,並且通常每一個版本都有 .tar.gz 和 .tar.bz2
兩種不一樣壓縮格式。要注意根據各個軟件包的版本號或者日期選擇一個最新的版本下載,有的庫的下載目錄下面也用一個 LATEST-xxx
的文件名告訴目前的最新版本是多少。因爲 .tar.bz2 壓縮格式的文件較小,推薦下載這種軟件包;若是沒有,再下載 .tar.gz 格式的包。
下面是目前各個庫的最新版本的軟件包:
glib-2.12.5.tar.bz2
atk-1.9.1.tar.bz2
cairo-1.2.0.tar.gz
pango-1.14.8.tar.bz2
gtk+-2.10.6.tar.bz2
能夠新建一個目錄,用於存放以上這些下載的軟件包。
因爲這些軟件包都是使用 GNU Autotools 工具建立的,因此各個軟件包的構建和安裝界面是相同的,都是 ./configure
&& make && make install。所以,咱們重點介紹 Glib 庫的安裝,對包括 GTK+
在內的其它庫只做簡單說明;在安裝其它庫的時候,可比照 Glib 庫的安裝過程進行。
6. 庫的安裝
6.1 安裝順序
根據依賴關係的要求,庫的安裝要按照這樣的前後順序進行:GLib、Atk、Cairo、Pango、Gtk+。
上述各個庫在安裝的時候,都會自動檢查其依賴的庫是否已經正確安裝;若是依賴庫沒有安裝,或者安裝不成功,或者沒有正確進行設置等都會致使安裝終止,並顯
示出相應的錯誤提示。不過,只要按照上面的順序安裝各個庫,並嚴格按照下面的步驟操做,通常很容易在不出現任何錯誤的狀況下順利地完成各個庫的安裝。
6.2 安裝過程
源碼安裝軟件包的過程可劃分爲如下幾個步驟:
解包
配置
構建
安裝
設置
下面以 Glib 的安裝爲例分別具體介紹庫安裝的各個過程。
6.2.1 解包
解包就是將軟件包解壓還原的過程。首先要進入軟件包所在的目錄,根據根據軟件包的類型是 .tar.gz 仍是 .tar.bz2,選擇相應的解包命令。
.tar.bz2 格式軟件包的解壓還原:
$ tar xjvf glib-2.12.5.tar.bz2
若是軟件包是 .tar.gz 格式的話,應該這樣解壓還原:
$ tar xzvf glib-2.12.5.tar.gz
上面的解包命令執行以後,會在當前工做目錄下生成一個名爲 glib-2.12.5 的目錄,Glib 軟件包的內容都存放在這個目錄下。
其它軟件包的解包過程與上面相似,只要把上面命令中的軟件包名替換便可。各個軟件包解包以後生成的目錄名通常是將軟件包名中的 .tar.bz2 或者 .tar.gz 去除以後的名稱,其格式是:庫名-版本號。
6.2.2 配置
配置(configure)的目的和結果是得到軟件構建和安裝所須要的
Makefile。爲此,在配置過程當中將對當前系統進行檢測,得到程序構建和安裝所須要的一些信息並最終記錄在 Makefile
中。其中的一些內容也能夠經過命令行參數進行指定,好比軟件包的安裝路徑(若是不特地指定安裝路徑的話,將默認使用 /usr/local
做爲安裝路徑。)
在前面已經規劃好了:咱們要將全部的軟件包都安裝在 /opt/gtk 目錄下面,因此能夠這樣作:
首先進入要安裝的軟件包目錄。例如,若是是 Glib,能夠執行 cd glib-2.12.5 命令進入目錄。
其次,執行下面的命令進行配置(之後安裝的各個軟件包的配置命令也是下面的形式):
$ ./configure --prefix=/opt/gtk
其中,configure 是在軟件包中包含的一個腳本文件(是由 GNU Autotools 工具產生的),./configure
是執行這個腳本文件,用 --prefix 指明軟件包的安裝目錄。這樣,在隨後的安裝過程當中(make
install)會把相應的文件拷貝到它後面指定的目錄下(/opt/gtk)。
注:能夠用 ./configure --help 命令查看各個軟件包中配置時提供的不一樣的參數選項和各個參數的意義。
注:一個庫能夠有兩種存在形態:共享庫(.so)和靜態庫(.a)。對於 GTK+
及其依賴庫,在源碼安裝的時候其默認設置是隻生成共享庫;若是須要靜態庫,應該在配置各個軟件包的時候分別加上 --enable-static
參數(參見 ./configure --help)。開發 GTK 程序時通常應使用其共享庫,可不安裝靜態庫。
因爲 Glib 只依賴於一些最基本的系統庫,因此在執行配置的過程當中應該不會出現任何問題纔是。然而,對於
GTK+和其它依賴庫,若是在配置過程當中發現須要的程序或者庫不存在,或者版本不符合要求,都會顯示相應的錯誤提示後異常停止配置過程。若是配置不成功,
則不能繼續進行下面的程序構建過程。
對新手來講,他們一般不清楚什麼樣的配置結果是成功的,什麼是失敗的。下面提供兩種簡單的檢查配置是否成功的方法:
配置過程當中輸出的信息,除了顯示在屏幕上以外,還記錄在一個名爲 config.log 的文件中。檢查這個文件中是否有
configure: exit 0 這樣的一句話(通常位於文件的後面部分或者最後一行)。若是是,說明配置成功;若是不是(好比
configure: exit 1)說明配置過程當中出現了錯誤,配置失敗。
在 ./configure 命令執行完畢後當即執行 echo $? 命令,檢查它的輸出結果。若是輸出是 0,說明配置成功;0
以外的數字說明配置失敗。在 Linux 系統上,能夠用這個方法檢查一個命令或程序在其結束後返回給系統的值是多少。通常 0 表明成功,非 0
表示程序異常退出。
6.2.3 構建
從源代碼生成程序的過程稱爲構建(Build)。這裏所說的「程序」是一個廣義的概念:既能夠是其通常意義上的二進制可執行程序(Program),也可
以是一個文本形式的可執行腳本(Script),還能夠是庫(Library)、頭文件(Header)、數據(Data)等等。一個軟件包中每每包含以
上一種或者多種形式的程序構建,其中以二進制可執行程序和庫最爲常見。
對於用編譯型語言(如 C 或者 C++)寫的程序來講(GTK+ 和它的一些依賴庫就是用 C 語言寫成的),軟件的構建過程主要是編譯和鏈接的過程。在 Linux 系統上,構建是經過執行 make 命令實現的:
$ make
make 是根據 Makefile 的內容來決定如何構建程序的,而這個 Makefile 就是上面配置的產物。執行 make 命令以後,程序的編譯過程就開始了。這是一個比較耗時的過程,特別是對於一些大型的軟件包(如 GTK+ 及其依賴庫)來講更是這樣。
make 結束後,也能夠執行 echo $? 命令檢查 make 是否執行成功。通常只要配置經過了,make 應該不會出現什麼問題纔是。
make 的結果,對於程序來講,主要生成的是可執行程序文件;對於庫來講,主要生成的是庫文件。下面的安裝過程將把須要的文件拷貝到在配置時指定的安裝目錄中去。
6.2.4 安裝
構建成功的軟件包的安裝是經過帶 install 參數的 make 進行的:
$ make install
須要在此說明的是:在 Linux 系統,除了 root
用戶和具備相應權限的用戶以外,通常用戶只有在本身的用戶目錄下才有寫權限;對於用戶目錄以外的其它目錄和文件,通常只能讀而不能寫。咱們在配置的時候將
設置的安裝目錄是 /opt/gtk,對於通常用戶來講是隻讀的。若是是這樣的話,上面的 make install
雖然被執行,可是因爲沒有寫的權限,不能向這個目錄中拷貝文件,因此安裝是不成功的。
通常須要以下面這樣先切換到 root 用戶,而後再進行安裝:
$ su
# make install
上面的「#」符號表示處於 root 狀態下的命令行提示符。
在執行完 make install 以後,也能夠用 echo $? 檢查是否執行安裝成功。
若是此時查看 /opt/gtk 目錄,你會發現這個目錄下又有幾個子目錄,如 bin、include、lib、share。這是由於每一個庫(如
Glib)又根據使用目的不一樣將安裝文件進行了劃分:bin 是執行文件目錄,include 是頭文件目錄,lib 是庫文件目錄,share
是庫的公用目錄,包括本地翻譯文件、各類格式的說明文檔和例子程序等。
安裝完成後,應該當即退出 root 用戶,返回到原來的用戶狀態:
# exit
root 用戶權限應該僅在切實須要的時候才使用。不少初學者不管作什麼都是以 root
進行,覺得這樣方便。其實對於新手而言這最是要不得,很容易因爲誤操做而損壞系統。即便只有你一我的使用一個 Linux
系統,也應該註冊一個普通用戶、平時以一個普通用戶的身份使用系統。
6.2.5 設置
新手每每不清楚爲何要對庫進行設置,要進行什麼樣的設置。爲此,在下面介紹了一些有關庫的設置的背景知識。若是已經瞭解了這部份內容,或者急於進行實際的設置操做,可直接轉到最後一小節「GTK+ 及其依賴庫的設置」。
6.2.5.1 搜索路徑
上面的安裝已經把庫的各種文件拷貝到指定的安裝目錄中了,這個庫也就能夠被其它程序或者庫來使用了。庫的使用主要包括兩方面的內容:對庫的頭文件的使用以
及對庫文件(靜態庫或共享庫)的使用。相應地,庫的設置也就是如何對這兩類文件進行定位的問題。對文件進行定位一般是用設置文件的搜索路徑的方法來解決
的。在使用的過程當中按照搜索路徑的前後順序查找,第一個找到文件將被使用。
庫的頭文件在程序中被包含使用,並且僅僅用在程序編譯階段,因此頭文件的默認搜索路徑是由編譯器提供的。處於默認搜索路徑內的頭文件不須要進行搜索路徑的
設置便可直接使用。雖然每一個編譯器提供的頭文件的默認搜索路徑不盡相同,可是都把 /usr/include
做爲默認的搜索路徑之一。使用處於默認搜索路徑以外的頭文件須要在編譯的時候經過編譯命令的 -I 參數指定其路徑。這是對頭文件進行定位的方式。
庫文件在鏈接(靜態庫和共享庫)和運行(僅限於使用共享庫的程序)時被使用,其搜索路徑是在系統中進行設置的。通常 Linux 系統把 /lib 和
/usr/lib
兩個目錄做爲默認的庫搜索路徑,因此使用這兩個目錄中的庫時不須要進行設置搜索路徑便可直接使用。對於處於默認庫搜索路徑以外的庫,須要將庫的位置添加到
庫的搜索路徑之中。設置庫文件的搜索路徑有下列兩種方式,可任選其一使用:
在環境變量 LD_LIBRARY_PATH 中指明庫的搜索路徑。
在 /etc/ld.so.conf 文件中添加庫的搜索路徑。
須要注意的是:第二種搜索路徑的設置方式對於程序鏈接時的庫(包括共享庫和靜態庫)的定位已經足夠了,可是對於使用了共享庫的程序的執行仍是不夠的。這是
由於爲了加快程序執行時對共享庫的定位速度,避免使用搜索路徑查找共享庫的低效率,因此是直接讀取庫列表文件 /etc/ld.so.cache
從中進行搜索的。/etc/ld.so.cache 是一個非文本的數據文件,不能直接編輯,它是根據 /etc/ld.so.conf
中設置的搜索路徑由 /sbin/ldconfig 命令將這些搜索路徑下的共享庫文件集中在一塊兒而生成的(ldconfig 命令要以 root
權限執行)。所以,爲了保證程序執行時對庫的定位,在 /etc/ld.so.conf 中進行了庫搜索路徑的設置以後,還必需要運行
/sbin/ldconfig 命令更新 /etc/ld.so.cache 文件以後才能夠。
在程序鏈接時,對於庫文件(靜態庫和共享庫)的搜索路徑,除了上面的設置方式以外,還能夠經過 -L 參數顯式指定。由於用 -L 設置的路徑將被優先搜索,因此在鏈接的時候一般都會以這種方式直接指定要鏈接的庫的路徑。
有的使用了共享庫的程序,在編譯和鏈接時都很順利,可是在運行時卻發生了找不到共享庫的問題,其緣由就是庫的搜索路徑沒有設置,或者設置不正確。
6.2.5.2 編譯和鏈接界面
通常來講,若是庫的頭文件不在 /usr/include 目錄中,那麼在編譯的時候須要用 -I
參數指定其路徑。因爲同一個庫在不一樣系統上可能位於不一樣的目錄下,用戶安裝庫的時候也能夠將庫安裝在不一樣的目錄下,因此即便使用同一個庫,因爲庫的路徑的
不一樣,形成了用 -I 參數指定的頭文件的路徑也可能不一樣,其結果就是形成了編譯命令界面的不統一。若是使用 -L
參數,也會形成鏈接界面的不統一。編譯和鏈接界面不統一會爲庫的使用帶來麻煩。
爲了解決編譯和鏈接界面不統一的問題,人們找到了一些解決辦法。其基本思想就是:事先把庫的位置信息等保存起來,須要的時候再經過特定的工具將其中有用的
信息提取出來供編譯和鏈接使用。這樣,就能夠作到編譯和鏈接界面的一致性。其中,目前最爲經常使用的庫信息提取工具就是下面介紹的 pkg-config。
6.2.5.3 pkg-config
pkg-config 是經過庫提供的一個 .pc 文件得到庫的各類必要信息的,包括版本信息、編譯和鏈接須要的參數等。這些信息能夠經過 pkg-config 提供的參數單獨提取出來直接供編譯器和鏈接器使用。
在默認狀況下,每一個支持 pkg-config 的庫對應的 .pc 文件在安裝後都位於安裝目錄中的 lib/pkgconfig
目錄下。例如,咱們在上面已經將 Glib 安裝在 /opt/gtk 目錄下了,那麼這個 Glib 庫對應的 .pc 文件是
/opt/gtk/lib/pkgconfig 目錄下一個叫 glib-2.0.pc 的文件(不妨看看這個文件的內容來得到對 .pc
文件的一些感性認識。)
使用 pkg-config 的 --cflags 參數能夠給出在編譯時所須要的選項,而 --libs 參數能夠給出鏈接時的選項。例如,假設一個 sample.c 的程序用到了 Glib 庫,就能夠這樣編譯:
$ gcc -c `pkg-config --cflags glib-2.0` sample.c
而後這樣鏈接:
$ gcc sample.o -o sample `pkg-config --libs glib-2.0`
或者上面兩步也能夠合併爲如下一步:
$ gcc sample.c -o sample `pkg-config --cflags --libs glib-2.0`
能夠看到:因爲使用了 pkg-config 工具來得到庫的選項,因此不論庫安裝在什麼目錄下,均可以使用相同的編譯和鏈接命令,帶來了編譯和鏈接界面的統一。
使用 pkg-config 工具提取庫的編譯和鏈接參數有兩個基本的前提:
庫自己在安裝的時候必須提供一個相應的 .pc 文件。不這樣作的庫說明不支持 pkg-config 工具的使用。
pkg-config 必須知道要到哪裏去尋找此 .pc 文件。
GTK+ 及其依賴庫支持使用 pkg-config 工具,因此剩下的問題就是如何告訴 pkg-config 到哪裏去尋找庫對應的 .pc 文件,這也是經過設置搜索路徑來解決的。 6.2.5.4 GTK+ 及其依賴庫的設置6.2.5.4.1 以編譯和鏈接爲目的的設置對於支持 pkg-config 工具的 GTK+ 及其依賴庫來講,庫的頭文件的搜索路徑的設置變成了對 .pc 文件搜索路徑的設置。.pc文件的搜索路徑是經過環境變量 PKG_CONFIG_PATH 來設置的,pkg-config 將按照設置路徑的前後順序進行搜索,直到找到指定的.pc 文件爲止。Linux 中環境變量的設置方式和使用的 shell 有關。在這裏是以 bash 爲例進行說明的。若是你發現這裏的環境變量的設置方法不能成功的話,應該檢查你在當前的終端中使用的是什麼 shell:$ ps --no-headers --format comm $$注:若是 ps 被定義爲別名,可能須要執行 \ps --no-headers --format comm $$ 才行。而後根據這種 shell 的環境變量的設置方法進行設置。若是系統中存在有 bash 的話,也能夠將 shell 切換爲 bash:$ bash這樣就能夠按照下面介紹的方法設置環境變量了。安裝完 Glib 後,在 bash 中應該進行以下設置:$ export PKG_CONFIG_PATH=/opt/gtk/lib/pkgconfig:$PKG_CONFIG_PATH能夠執行下面的命令檢查是否 /opt/gtk/lib/pkgconfig 路徑已經設置在 PKG_CONFIG_PATH 環境變量中:$ echo $PKG_CONFIG_PATH這樣設置以後,使用 Glib 庫的其它程序或庫在編譯的時候 pkg-config 就知道首先要到 /opt/gtk/lib/pkgconfig這個目錄中去尋找 glib-2.0.pc 了(GTK+ 和其它的依賴庫的 .pc 文件也將拷貝到這裏,也會首先到這裏搜索它們對應的 .pc文件)。以後,經過 pkg-config 就能夠把其中庫的編譯和鏈接參數提取出來供程序在編譯和鏈接時使用。另外還須要注意的是:環境變量的設置只對當前的終端窗口有效。若是到了沒有進行上述設置的終端窗口中,pkg-config 將找不到新安裝的 glib-2.0.pc 文件、從而可能使後面進行的安裝(如 Glib 以後的 Atk 的安裝)沒法進行。 6.2.5.4.2 以鏈接和執行爲目的的設置前面已經說明過了,庫搜索路徑的設置有兩種方式:在環境變量 LD_LIBRARY_PATH 中設置以及在 /etc/ld.so.conf 文件中設置。其中,第二種設置方式須要 root 權限,以改變 /etc/ld.so.conf 文件並執行 /sbin/ldconfig命令。並且,當系統從新啓動後,全部的基於 GTK2 的程序在運行時都將使用新安裝的 GTK+ 庫。不幸的是,因爲 GTK+版本的改變,這有時會給應用程序帶來兼容性的問題,形成某些程序運行不正常。爲了不出現上面的這些狀況,在 GTK+ 及其依賴庫的安裝過程當中對於庫的搜索路徑的設置將採用第一種方式進行。這種設置方式不須要 root 權限,設置也簡單:$ export LD_LIBRARY_PATH=/opt/gtk/lib:$LD_LIBRARY_PATH能夠用下面的命令查看 LD_LIBRAY_PATH 的設置內容:$ echo $LD_LIBRARY_PATH至此,庫的兩種設置就完成了。因爲咱們將 GTK+ 及其依賴庫設置安裝在同一目錄中,因此上面的對環境變量 PKG_CONFIG_PATH 和 LD_LIBRAY_PATH 的設置在一個終端窗口中只要進行一次就能夠了,之後安裝其它庫的時候不須要再行設置。通過以上設置以後,使用了 Glib 的程序(以下面要安裝的 Atk)就可以根據在 PKG_CONFIG_PATH 和LD_LIBRAY_PATH 中設置的搜索路徑找到新安裝的 Glib 庫了。若是不進行上面的設置,或者設置有誤,可能找到的是舊版的Glib,也可能出現找不到 Glib 的錯誤。如今,能夠執行下面的命令檢查 Glib 的版本號:$ pkg-config --modversion glib-2.0若是顯示的版本號和你進行安裝的軟件包中的版本號一致,那麼恭喜你! 你已經成功地完成了 Glib 庫的安裝和設置,能夠繼續進行其它庫的安裝了。注意:Atk 等庫的編譯會用到 /opt/gtk/bin 中的命令,因此還應該對 PATH 環境變量進行以下設置:$ export PATH=/opt/gtk/bin:$PATH 6.3 其它庫的安裝在確認已經成功安裝了 Glib 以後,能夠順次安裝其它的庫。6.3.1 安裝 Atk參考「安裝 Glib」一節中的操做進行。若是始終在同一個終端窗口中操做的話,最後的設置過程可不執行。檢查 Atk 的版本號:$ pkg-config --modversion atk6.3.2 安裝 Cairo參考「安裝 Glib」一節中的操做進行。若是始終在同一個終端窗口中操做的話,最後的設置過程可不執行。檢查 Cairo 的版本號:$ pkg-config --modversion cairo6.3.3 安裝 Pango參考「安裝 Glib」一節中的操做進行。若是始終在同一個終端窗口中操做的話,最後的設置過程可不執行。檢查 Pango 的版本號:$ pkg-config --modversion pango注意:配置 Pango 成功的另一個標誌是:在 ./configure 最後顯示出來的一行信息 backends: FreeType XXft Cairo 中應該有 Cairo 字樣的出現。若是沒有,好比象 backends: FreeType X Xft 這樣,說明Pango 的配置不成功;Pango 配置不成功,說明其依賴庫 Cairo 沒有安裝或者 Cairo 庫的設置不正確。6.3.4 安裝 Gtk+參考「安裝 Glib」一節中的操做進行。若是始終在同一個終端窗口中操做的話,最後的設置過程可不執行。檢查 GTK+ 的版本號:$ pkg-config --modversion gtk+-2.07. 庫的使用7.1 庫使用以前的設置在咱們採用的安裝方案中,因爲是使用環境變量對 GTK+ 及其依賴庫進行的設置,因此當系統從新啓動、或者新開一個終端窗口以後,若是想使用新安裝的GTK+ 庫,須要如上面那樣從新設置 PKG_CONFIG_PATH 和 LD_LIBRARY_PATH 環境變量。這種使用 GTK+ 的方法,在使用以前多了一個對庫進行設置的過程。雖然顯得稍微繁瑣了一些,但倒是一種最安全的使用 GTK+ 庫的方式,不會對系統上已經存在的使用了 GTK+ 庫的程序(好比 GNOME 桌面)帶來任何衝擊。爲了使庫的設置變得簡單一些,能夠把下面的這兩句設置保存到一個文件中(好比 set_gtk-2.10 文件):export PKG_CONFIG_PATH=/opt/gtk/lib/pkgconfig:$PKG_CONFIG_PATHexport LD_LIBRARY_PATH=/opt/gtk/lib:$LD_LIBRARY_PATH以後,就能夠用下面的方法進行庫的設置了(其中的 source 命令也能夠用 . 代替):$ source set_gtk-2.10只有在用新版的 GTK+ 庫開發應用程序、或者運行使用了新版 GTK+ 庫的程序的時候,纔有必要進行上述設置。若是想避免使用 GTK+ 庫以前上述設置的麻煩,能夠把上面兩個環境變量的設置在系統的配置文件中(如/etc/profile)或者本身的用戶配置文件中(如 ~/.bash_profile) ;庫的搜索路徑也能夠設置在/etc/ld.so.conf 文件中,等等。這種設置在系統啓動時會生效,從而會致使使用 GTK+ 的程序使用新版的 GTK+運行庫,這有可能會帶來一些問題。固然,若是你發現用新版的 GTK+ 代替舊版沒有什麼問題的話,使用這種設置方式是比較方便的。7.2 庫文檔使用一個庫免不了要參考庫的文檔。GTK+ 及其依賴庫的各個庫的參看文檔也被安裝,具體位置在安裝目錄的 share/gtk-doc/html 目錄下分別存放。能夠用瀏覽器分別打開每一個目錄中的 index.html,而後將其添加到網絡書籤中以便隨時參考。(完)