为了使库的设置变得简单一些,可以把下面的这两句设置保存到一个文件中(比如set_gtk-2.10 文件):
1 2 | export PKG_CONFIG_PATH=/opt/gtk/lib/pkgconfig:$PKG_CONFIG_PATH export LD_LIBRARY_PATH=/opt/gtk/lib:$LD_LIBRARY_PATH |
其中的环境变量LD_LIBRARY_PATH变量主要是添加新安装库的搜索路径。之后,就可以用下面的方法进行库的设置了(其中的source命令也可以用.代替):
1 | $ source set_gtk-2.10 |
只有在用新版的GTK+库开发应用程序、或者运行使用了新版GTK+库的程序的时候,才有必要进行上述设置。
如果想避免使用GTK+库之前上述设置的麻烦,可以把上面两个环境变量的设置在系统的配置文件中(如 /etc/profile)或者自己的用户配置文件中(如 ~/.bash_profile) ;库的搜索路径也可以设置在 /etc/ld.so.conf 文件中,等等。这种设置在系统启动时会生效,从而会导致使用 GTK+ 的程序使用新版的 GTK+ 运行库,这有可能会带来一些问题。当然,如果你发现用新版的GTK+代替旧版没有什么问题的话,使用这种设置方式是比较方便的。加入到~/.bashrc中,例如:
1 | PKG_CONFIG_PATH=/opt/gtk/lib/pkgconfig |
重启之后:
1 2 | [root@localhost ~]# echo $PKG_CONFIG_PATH /opt/gtk/lib/pkgconfig |
三、运行时库的连接
库文件在连接(静态库和共享库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的。一般Linux系统把/lib和/usr/lib两个目录作为默认的库搜索路径,所以使用这两个目录中的库是不需要进行设置搜索路径即可直接使用。对于处于默认库搜索路径之外的库,需要将库的位置添加到 库的搜索路径之中。设置库文件的搜索路径有下列两种方式,可任选其一使用:
<1> 在环境变量 LD_LIBRARY_PATH 中指明库的搜索路径。
<2> 在/etc/ld.so.conf 文件中添加库的搜索路径。
将自己可能存放库文件的路径都加入到/etc/ld.so.conf中是明智的选择 ^_^
添加方法也极其简单,将库文件的绝对路径直接写进去就OK了,一行一个。例如:
1 2 3 | /usr/X11R6/lib /usr/local/lib /opt/lib |
需要注意的是:第二种搜索路径的设置方式对于程序连接时的库(包括共享库和静态库)的定位已经足够了,但是对于使用了共享库的程序的执行还是不够的。这是因为为了加快程序执行时对共享库的定位速度,避免使用搜索路径查找共享库的低效率,所以是直接读取库列表文件/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文件之后才可以。ldconfig简单的说,它的作用就是将/etc/ld.so.conf列出的路径下的库文件缓存到/etc/ld.so.cache以供使用。因此当安装完一些库文件(例如刚安装好glib),或者修改ld.so.conf增加新的库路径后,需要运行一下 /sbin/ldconfig使所有的库文件都被缓存到ld.so.cache中,如果没做,即使库文件明明就在/usr/lib下的,也是不会被使用的,结果编译过程中抱错,缺少xxx库,去查看发现明明就在那放着,搞的想大骂computer蠢猪一个。 ^_^
在程序连接时,对于库文件(静态库和共享库)的搜索路径,除了上面的设置方式之外,还可以通过-L参数显式指定。因为用-L设置的路径将被优先搜索,所以在连接的时候通常都会以这种方式直接指定要连接的库的路径。
前面已经说明过了,库搜索路径的设置有两种方式:在环境变量LD_LIBRARY_PATH中设置以及在/etc/ld.so.conf文件中设置。其中,第二种设置方式需要root权限,以改变/etc/ld.so.conf文件并执行/sbin/ldconfig命令。而且,当系统重新启动后,所有的基于GTK2的程序在运行时都将使用新安装的GTK+库。不幸的是,由于GTK+版本的改变,这有时会给应用程序带来兼容性的问题,造成某些程序运行不正常。为了避免出现上面的这些情况,在GTK+及其依赖库的安装过程中对于库的搜索路径的设置将采用第一种方式进行。这种设置方式不需要root权限,设置也简单:
1 | $ export LD_LIBRARY_PATH=/opt/gtk/lib:$LD_LIBRARY_PATH |
可以用下面的命令查看 LD_LIBRAY_PATH 的设置内容:
1 | $ echo $LD_LIBRARY_PATH |
至此,库的两种设置就完成了。
四、参考文章
ld.so.conf 文件与PKG_CONFIG_PATH变量
pkg-config使用
Pages: 1 2
你好, 转载了你的文章, 我已经注明了出处
如果这样不可以的话请联系我!
[回复]
easylife
Firefox 6.0
Windows 7 x64 Edition回复:
八月 30th, 2011 at 22:46
@PSWZ-ZhangY, 转载最好注明出处。
[回复]
PSWZ-ZhangY
Firefox 3.6.20
Ubuntu 10.10 x64回复:
八月 30th, 2011 at 23:14
@easylife, 额~~巨汗~忘了, 太不好意思了~
现在正在把之前所有的博客汇集, 比较关注linux编程
多交流啊
转载到这个地址了:http://pswzyu.iteye.com/blog/1161295
现在已经在文章开头加上了出处, 我转载文章很注意的~这篇在编辑的时候马虎了~
[回复]
你好,我想请教你一个问题,恳请你给点建议,谢谢:
我在安装virt-viewer时,遇到了
checking for pkg-config… /usr/bin/pkg-config
checking pkg-config is at least version 0.9.0… yes
checking for GTK2… configure: error: Package requirements (gtk+-2.0 >= 2.10.0) were not met:
No package ‘gtk+-2.0′ found
但我使用 rpm -qa | grep gtk2 命令,可以得到如下结果:
gtk2-2.10.4-16.el5
gtk2-2.10.4-16.el5
pygtk2-libglade-2.10.1-8.el5
gtk2-engines-2.8.0-3.el5
pygtk2-2.10.1-8.el5
gtk2-engines-2.8.0-3.el5
但是,使用 pkg-config –list-all | grep gtk 命令,却只得到:
gtk-demo gtk-query-immodules-2.0-32 gtk-query-immodules-2.0-64 gtk-update-icon-cache
我想,会不会因为 gtk 是通过 rpm 方式安装的,导致在 /usr/lib/pkgconfig 路径下面没有生相应的 .pc 文件,这样的话,我应该怎么样做才能让 pkg-config来找到我的 gtk 库呢?
[回复]
我在linux下测试
cc program.c `pkg-config –cflags –libs gnomeui`
bash提示:gcc:pkg-config –cflags –libs gtk2.0: 没有那个文件或目录.
而用
cc program.c $(pkg-config –cflags –libs gnomeui)却能顺利通过。不知道第一个哪里出了问题。
[回复]
博客做的很靓啊,
我今天也用上了pkg-config,在MSYS里,hoho
[回复]
easylife
Firefox 3.6
Windows 7回复:
五月 20th, 2010 at 21:14
@Wayne, 谢谢,我没用过MSYS。呵呵!
[回复]