将新库所在路径添加到LD_LIBRARY_PATH
(在Mac上名称略有不同...)
您可以使用-L /my/dir -lfoo
选项,运行时使用LD_LIBRARY_PATH指向库的位置。
小心使用LD_LIBRARY_PATH - 简而言之(来自链接):
..含义..:
安全性:请记住,在搜索标准位置之前,LD_LIBRARY_PATH中指定的目录会被搜索?这样,一个可怕的人可以让您的应用程序加载包含恶意代码的共享库版本!这是setuid/setgid可执行文件忽略该变量的原因之一!
性能:链接加载器必须搜索所有指定目录,直到找到共享库所在的目录-对于应用程序链接的所有共享库!这意味着需要大量的系统调用open(),这些调用将返回“ENOENT(没有此类文件或目录)”!如果路径包含许多目录,则失败调用的数量将线性增加,并且您可以从应用程序的启动时间开始推断出来。如果某些(或所有)目录在NFS环境中,则应用程序的启动时间可能会真正变长-并且可能会使整个系统变慢!
不一致性:这是最常见的问题。LD_LIBRARY_PATH强制应用程序加载其未链接的共享库,这很可能与原始版本不兼容。这可能非常明显,即应用程序崩溃,或者它可能导致错误的结果,如果选择的库与原始版本不太一样。特别是后者有时很难调试。
或者
通过gcc到链接器使用rpath选项-运行时库搜索路径,将被用于替代在标准目录中查找(gcc选项):
-Wl,-rpath,$(DEFAULT_LIB_INSTALL_PATH)
这对于临时解决方案来说是不错的。链接器在查找标准目录之前会先在LD_LIBRARY_PATH中查找库。
如果您不想永久更新LD_LIBRARY_PATH,可以在命令行上动态更改:
LD_LIBRARY_PATH=/some/custom/dir ./fooo
你可以通过以下方式查看连接器已知的库:
/sbin/ldconfig -p | grep libpthread
libpthread.so.0 (libc6, OS ABI: Linux 2.6.4) => /lib/libpthread.so.0
你可以检查你的应用程序使用哪个库:
ldd foo
linux-gate.so.1 => (0xffffe000)
libpthread.so.0 => /lib/libpthread.so.0 (0xb7f9e000)
libxml2.so.2 => /usr/lib/libxml2.so.2 (0xb7e6e000)
librt.so.1 => /lib/librt.so.1 (0xb7e65000)
libm.so.6 => /lib/libm.so.6 (0xb7d5b000)
libc.so.6 => /lib/libc.so.6 (0xb7c2e000)
/lib/ld-linux.so.2 (0xb7fc7000)
libdl.so.2 => /lib/libdl.so.2 (0xb7c2a000)
libz.so.1 => /lib/libz.so.1 (0xb7c18000)
libfoo.*
文件存在,以及它们在哪里 --.so
没有.0
,.a
等等? - Alex MartelliRPATH
。 - Jesper Juhl