很好,运行正常!LD_LIBRARY_PATH很适合做快速测试,尤其是那些你没有管理员权限的系统。另一方面,导出LD_LIBRARY_PATH变量意味着可能会造成其他依赖LD_LIBRARY_PATH的程序出现问题,因此在做完测试后最好将LD_LIBRARY_PATH恢复成之前的样子。

 

使用rpath

现在让我们来试试rpath,首先需要清除LD_LIBRARY_PATH,确保我们是使用rpath来搜索库文件。Rpath,或者称为run path,是种可以将共享库位置嵌入程序中的方法,从而不用依赖于默认位置和环境变量。我们在连接环节使用rpath。注意“-Wl,-rpath=/home/username/foo”选项。-Wl会发送以逗号分隔的选项到连接器,因此我们通过它发送-rpath选项到连接器。(译者按:逗号分隔符后面没有空格,而是紧跟需要发送的选项。本例中为-rpath。一定注意"-Wl,-rpath"之间没有空格。)

$ unset LD_LIBRARY_PATH
$gcc-L/home/username/foo -Wl,-rpath=/home/username/foo -Wall -o test main.c -lfoo
$ ./test
This is a shared library test...
Hello, I'm a shared library

 

非常好,奏效了。rpath方法非常棒,因为每个程序都可以单独罗列它自己的共享库位置,因此不同的程序不会再在错误的路径上搜索LD_LIBRARY_PATH。

 

rpath和LD_LIBRARY_PATH

rpath也存在一些反作用面。首先,它要求共享库必须安装在一个固定的位置,这样所有的用户才可以在同一个位置访问到库。这就意味着在系统配置中不够灵活。其次,如果库涉及NFS挂载或者其他网络驱动,你在启动程序时会遇到延时或者更糟的情况。

 

使用ldconfig修改ld.so

如果我们想让系统上所有用户都可以使用我的库时该怎么办?对此,你需要管理员权限。缘由有二:首先,将库放到标准位置,很可能是/usr/lib或者/usr/local/lib,这些地方普通用户是没有写的权限。其次,你需要修改ld.so配置文件并缓存。以root身份做一下操作:

$cp/home/username/foo/libfoo.so /usr/lib
$chmod0755/usr/lib/libfoo.so