源碼安裝gtk+-2.0時遇到的幾個問題及解決辦法

我用的發行版是 Ubuntu7.04,最簡單的辦法就是用「新立得軟件包管理器」,安裝「libgtk2.0-dev」這個包便可。
但我打算從源碼安裝。

須要下載的包:
ftp://mirrors.kernel.org/gnu/gettext/gettext-0.17.tar.gz
ftp://ftp.gtk.org/pub/glib/2.15/glib-2.15.1.tar.bz2
ftp://ftp.gtk.org/pub/pango/1.19/pango-1.19.0.tar.bz2
http://ftp.gnome.org/pub/gnome/sources/atk/1.20/atk-1.20.0.tar.bz2
ftp://ftp.gtk.org/pub/gtk/v2.10/dependencies/jpegsrc.v6b.tar.gz
ftp://ftp.remotesensing.org/pub/libtiff/tiff-3.8.2.tar.gz
ftp://ftp.gtk.org/pub/gtk/2.12/gtk+-2.12.4.tar.bz2

在你的系統中可能會須要更多的軟件包,請google之,下載之,安裝之。

最簡單的安裝方法就是:
tar -zxvf *.gz
tar -jxvf *.bz2
cd gettext-0.17 (或者glib-2.15.一、pango-1.19.0、atk-1.20.0、jpegsrc-v6b、tiff-3.8.二、gtk+-2.12.4)
./configure --prefix=/usr (記住這裏必定是「/usr」,不是安裝在/usr下面的會很麻煩,後面就講這個)
make
sudo make install

安裝順序是:gettext、glib、pango、atk、tiff、jpeg、gtk+。
若是你的系統中沒有缺乏其餘的包的話,應該進行的很順利。

我安裝的路徑不是/usr,因此遇到了一些問題。下面就講一下解決辦法。
先來看幾個相關的環境變量:PATH、LDFLAGS、CFLAGS

PATH :你們應該都很熟悉。安裝一個包後可能會在安裝目錄創建一個bin目錄,裏面都是些可執行程序,爲了讓系統能找到這些程序,就須要咱們把該路徑加入到PATH環境變量中。下面會講到如何加入。

LDFLAGS :gcc等編譯器會用到的一些優化參數,也能夠在裏面指定庫文件的位置。用法:LDFLAGS=「-L/usr/lib -L/path/to/your/lib」。每安裝一個包都幾乎必定的會在安裝目錄裏創建一個lib目錄。若是你明明安裝了某個包,而安裝另外一個包時,它愣是說找不到,那就把那個包的lib路徑加入的LDFALGS中試一下吧。

CFLAGS :和LDFLAGS相似,只不過要向里加如的是頭文件(.h文件)的路徑,如:CFLAGS=「-I/usr/include -I/path/to/your/include」。一樣地,安裝一個包時會在安裝路徑下創建一個include目錄,當安裝過程當中出現問題時,試着把之前安裝的包的include目錄加入到該變量中來。

那如何在那些變量中加入這些路徑呢?以PATH變量爲例。
一種方法是 :直接在命令行下:
$ PATH="$PATH:/path/to/your/bin:/another/path/to/bin"
$ export PATH
這種方法的好處是方便,當即生效,缺點是把當前會話或shell關了以後就失效了,下次還得運行一遍。

另外一種方法是 :把下面的兩行內容加入到~/.bashrc文件中,若是想讓其影響到整個系統而不只僅是當前用戶,就把下面的內容加入到/etc/bash.bashrc(記得有的系統是/etc/bashrc這個文件)
PATH = " $PATH:/path/to/your/bin:/another/path/to/bin "
export PATH
而後,從新啓動shell便可。

須要注意的是,PATH變量的分隔符是:號,其餘的是空格,
因此LDFLAGS應該是這樣:
LDFLAGS=「$LDFLAGS -L/path/to/lib -L/path/to/lib」
CFLAGS應該是這樣:
CFLAGS=「$CFLAGS -I/path/to/iclude -I/path/to/include」

另外,很重要的東東是:/etc/ld.so.conf、ldconfig、PKG_CONFIG_PATH
這個已經有人講過了,現摘抄以下:
摘自:http :// bbs . chinaunix . net / archiver / tid - 655625 . html

首先說下
/ etc / ld . so . conf :
這個文件記錄了編譯時使用的動態連接庫的路徑。
默認狀況下,編譯器只會使用
/ lib和 / usr / lib這兩個目錄下的庫文件
若是你安裝了某些庫,好比在安裝gtk
+- 2.4 . 13時它會須要glib - 2.0   >=   2.4 . 0 , 辛苦的安裝好glib後
沒有指定 
-- prefix =/ usr 這樣glib庫就裝到了 / usr / local下,而又沒有在 / etc / ld . so . conf中添加 / usr / local / lib
這個搜索路徑,因此編譯gtk
+- 2.4 . 13就會出錯了  : (
對於這種狀況有兩種方法解決:
一:在編譯glib
- 2.4 . x時,指定安裝到 / usr下,這樣庫文件就會放在 / usr / lib中,gtk就不會找不到須要的庫文件了  : )
對於安裝庫文件來講,這是個好辦法,這樣也不用設置PKG_CONFIG_PATH了 (稍後說明)

二:將
/ usr / local / lib加入到 / etc / ld . so . conf中,這樣安裝gtk時就會去搜索 / usr / local / lib , 一樣能夠找到須要的庫  : )
/ usr / local / lib加入到 / etc / ld . so . conf也是必須的,這樣之後安裝東東到local下,就不會出現這樣的問題了。
將本身可能存放庫文件的路徑都加入到
/ etc / ld . so . conf中是明智的選擇  ^ _ ^
添加方法也極其簡單,將庫文件的絕對路徑直接寫進去就OK了,一行一個。例如:
/ usr / X11R6 / lib
/ usr / local / lib
/ opt / lib


再來看看ldconfig是個什麼東東吧 :
它是一個程序,一般它位於
/ sbin下,是root用戶使用的東東。具體做用及用法能夠man ldconfig查到
簡單的說,它的做用就是將
/ etc / ld . so . conf列出的路徑下的庫文件 緩存到 / etc / ld . so . cache 以供使用
所以當安裝完一些庫文件,(例如剛安裝好glib),或者修改ld
. so . conf增長新的庫路徑後,須要運行一下 / sbin / ldconfig
使全部的庫文件都被緩存到ld
. so . cache中,若是沒作,即便庫文件明明就在 / usr / lib下的,也是不會被使用的,結果
編譯過程當中抱錯,缺乏xxx庫,去查看發現明明就在那放着,搞的想大罵computer蠢豬一個。 
^ _ ^
我曾經編譯KDE時就犯過這個錯誤,(它須要每編譯好一個東東,都要運行一遍),因此

切記改動庫文件後必定要運行一下ldconfig,在任何目錄下運行均可以。


再來講說 PKG_CONFIG_PATH這個變量吧
:
常常在論壇上看到有人問
" 爲何我已經安裝了glib-2.4.x,可是編譯gtk+-2.4.x 仍是提示glib版本過低阿?
爲何我安裝了glib-2.4.x,仍是提示找不到阿?。。。。。。
" 都是這個變量搞的鬼。
先來看一個編譯過程當中出現的錯誤 (編譯gtk
+- 2.4 . 13 ) :

checking 
for  pkg - config   / usr / bin / pkg - config
checking 
for  glib - 2.0   >=   2.4 . 0  atk  >=   1.0 . 1  pango  >=   1.4 . 0   Package  glib - 2.0  was not found in the pkg - config search path .
Perhaps you should add the directory containing `glib
- 2.0 . pc '
to the PKG_CONFIG_PATH environment variable
No package 
' glib - 2.0 '  found

configure: error: Library requirements (glib-2.0 >= 2.4.0 atk >= 1.0.1 pango >= 1.4.0) not met; 
consider adjusting the PKG_CONFIG_PATH environment variable 
if your libraries are in a nonstandard prefix so pkg-config can find them.
[root@NEWLFS gtk+-2.4.13]#
很明顯,上面這段說明,沒有找到glib-2.4.x,而且提示應該將glib-2.0.pc加入到PKG_CONFIG_PATH下。
究竟這個pkg-config PKG_CONFIG_PATH glib-2.0.pc 是作什麼的呢? let me tell you ^_^
先說說它是哪冒出來的,當安裝了pkgconfig-x.x.x這個包後,就多出了pkg-config,它就是須要PKG_CONFIG_PATH的東東
pkgconfig-x.x.x又是作什麼的? 來看一段說明:

The pkgconfig package contains tools for passing the include path and/or library paths 
to build tools during the make file execution.

pkg-config is a function that returns meta information for the specified library.

The default setting for PKG_CONFIG_PATH is /usr/lib/pkgconfig because of the prefix we use 
to install pkgconfig. You may add to PKG_CONFIG_PATH by exporting additional paths 
on your system where pkgconfig files are installed. Note that PKG_CONFIG_PATH is 
only needed when compiling packages, not during run-time.


我想看過這段說明後,你已經大概瞭解了它是作什麼的吧。
其實pkg-config就是向configure程序提供系統信息的程序,好比軟件的版本啦,庫的版本啦,庫的路徑啦,等等
這些信息只是在編譯其間使用。你能夠 ls /usr/lib/pkgconfig 下,會看到許多的*.pc,用文本編輯器打開
會發現相似下面的信息:

prefix=/usr
exec_prefix=$
libdir=$/lib
includedir=$/include

glib_genmarshal=glib-genmarshal
gobject_query=gobject-query
glib_mkenums=glib-mkenums

Name: GLib
Description: C Utility Library
Version: 2.4.7
Libs: -L$ -lglib-2.0
Cflags: -I$/glib-2.0 -I$/glib-2.0/include

明白了吧,configure就是靠這些信息判斷你的軟件版本是否符合要求。而且獲得這些東東所在的位置,要不去哪裏找呀。
不用我說你也知道爲何會出現上面那些問題了吧。

解決的辦法很簡單,設定正確的PKG_CONFIG_PATH,假如將glib-2.x.x裝到了/usr/local/下,那麼glib-2.0.pc就會在
/usr/local/lib/pkgconfig下,將這個路徑添加到PKG_CONFIG_PATH下就能夠啦。而且確保configure找到的是正確的
glib-2.0.pc,就是將其餘的lib/pkgconfig目錄glib-2.0.pc幹掉就是啦。(若是有的話 ^-^)
設定好後能夠加入到~/.bashrc中,例如:
PKG_CONFIG_PATH=/opt/kde-3.3.0/lib/pkgconfig:/usr/lib/pkgconfig:/usr/local/pkgconfig:
/usr/X11R6/lib/pkgconfig
[root@NEWLFS ~]#echo $PKG_CONFIG_PATH
/opt/kde-3.3.0/lib/pkgconfig:/usr/lib/pkgconfig:/usr/local/pkgconfig:/usr/X11R6/lib/pkgconfig


從上面能夠看出,安裝庫文件時,指定安裝到/usr,是頗有好處的,不管是/etc/ld.so.conf仍是PKG_CONFIG_PATH
默認都會去搜索/usr/lib的,能夠省下許多麻煩,不過從源碼包管理上來講,都裝在/usr下
管理是個問題,不如裝在/usr/local下方便管理
其實只要設置好ld.so.conf,PKG_CONFIG_PATH路徑後,就OK啦 ^_^ 

看了以上內容相信你應該能順利安裝gtk2.0了,而且之後安裝個什麼包,也不會被那一層層的依賴關係搞的一頭霧水而無從下手了。

下面是一些具體問題:
1.如何刪除舊的glib庫
這樣的問題通常是在安裝glib時會遇到,若是安裝其餘庫時也遇到了,那就採用相同的方法。
通常是在./configure 的時候遇到的,錯誤信息以下:
# ./configure提示:
checking  for  GLIB  -  version  >=   2.5 . 7
***  'pkg - config  -- modversion glib - 2.0 ' returned  2.12 . 0 , but GLIB ( 2.10 . 3 )
***  was found !   If  pkg - config was correct, then it is best
***  to remove the old version of GLib. You may also be able to fix the error
***  by modifying your LD_LIBRARY_PATH enviroment variable, or by editing
***   / etc / ld.so.conf. Make sure you have run ldconfig  if  that is
***  required on your system.
***   If  pkg - config was wrong, set the environment variable PKG_CONFIG_PATH
***  to point to the correct configuration files
no
configure: error:
***  GLIB  2.5 . 7  or better is required. The latest version of
***  GLIB is always available from ftp: // ftp.gtk.org / If  GLIB is installed
***  but not  in  the same location as pkg - config add the location of the file
***  glib - 2.0 .pc to the environment variable PKG_CONFIG_PATH.

若是舊版的glib也是手工安裝的話,卸載就簡單了,以下:
rpm安裝的包用rpm   -e刪除,
源代碼安裝的包用make   uninstall

若是不是rpm或源碼包已經被刪,那隻能直接刪文件了。通常包括以下文件:
a) /usr/lib/libglib-*
b) /usr/lib/pkgconfig/glib-2.0.pc
c) /usr/iclude/glib-2.0
d) /usr/share/glib-2.0
e) /usr/share/locale/*/LC_MESSAGES/glib20.mo
差很少就這些了,刪除以後就能夠繼續安裝新版glib了,安裝完以後,能夠查看安裝目錄下的文件,而後到系統默認路徑下去找相應的舊版的文件,刪除之,這樣就刪乾淨了。
刪除以前最後作一下記錄,或乾脆備份一下,以防刪錯。而且建議在原來的位置創建一個名爲原來的文件名的且指向新文件的連接文件,由於或許某些程序會直接訪問系統默認目錄。

2. 安裝gtk+時,./configure 找不到TIFF庫。在LDFLAGS和CFLAGS變量中加入tiff庫安裝目錄的lib和include路徑便可。

3. ft,安裝的時候沒記筆記,如今想不起都出現過什麼問題了。若是有什麼問題歡迎找我交流。
相關文章
相關標籤/搜索