库文件在链接(静态库和共享库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的。一般 Linux 系统把
/lib 和
/usr/lib 两个目录作为默认的库搜索路径,所以使用这两个目录中的库时不需要进行设置搜索路径即可直接使用。但是,对于处于默认库搜索路径之外的库,就需要将库的位置添加到库的搜索路径之中。设置库文件的搜索路径有下列两种方式,可任选其一使用:
- 在环境变量
LD_LIBRARY_PATH
中指明库的搜索路径。
- 在
/etc/ld.so.conf
文件中添加库的搜索路径。
方法一
要在 Linux 系统中添加库路径,我们很容易想到环境变量
LD_LIBRARY_PATH
。这种设置方式很简单,也不需要 root 权限,命令格式如下:
$ export LD_LIBRARY_PATH=<your-lib-path>:$LD_LIBRARY_PATH
例如:
$ export LD_LIBRARY_PATH=/opt/gtk/lib:$LD_LIBRARY_PATH
可以用如下命令查看
LD_LIBRAY_PATH
是否设置成功。
$ echo $LD_LIBRARY_PATH
要注意的是,这种方法只是临时设置环境变量
LD_LIBRARY_PATH
,重启或打开新的 Shell 之后,一切设置将不复存在。为了让这种方法更完美一些,可以将该
LD_LIBRARY_PATH
的
export
语句写到系统文件中,例如
/etc/profile
、
/etc/export
、
~/.bashrc
或者
~/.bash_profile
等等。
写在不同文件对该语句的读取时机会有所不同,例如,
~/.bashrc
在每次登陆和每次打开 shell 都读取一次,而
~/.bash_profile
只在登陆时读取一次。但是对于嵌入式Linux来说,有些文件可能没有,这就需要根据目标机器的情况来设置了。我一般是加到
~/.bashrc
中,将 export 语句添加在该文件的未尾。修改完后,还差一步,使配置生效!可以打开一个 Shell,或者使用
source
或
.
(点命令)使配置文件生效。如:
$ source ~/.bashrc
方法二
将自己可能存放库文件的路径都加入到
/etc/ld.so.conf
中是明智的选择,因为这种添加库路径的效果是永久的。添加方法也很简单,将库文件的绝对路径直接写进去就OK了,
一行一个。例如:
/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 蠢猪一个。
除了修改
/etc/ld.so.conf
,还可以在
/etc/ld.so.conf.d
目录下添加
*.conf
文件,然后往该文件添加搜索路径。同样,需要运行 ldconfig 使之生效。
参考:
http://www.linuxidc.com/Linux/2008-04/12285.htm