源码安装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.1、pango-1.19.0、atk-1.20.0、jpegsrc-v6b、tiff-3.8.2、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,安装的时候没记笔记,现在想不起都出现过什么问题了。如果有什么问题欢迎找我交流。

你可能感兴趣的:(源码安装gtk+-2.0时遇到的几个问题及解决办法)