添加新库所在的路径LD_LIBRARY_PATH
(它在 Mac 上的名称略有不同......)
您的解决方案应该与使用-L/my/dir -lfoo
选项,在运行时使用 LD_LIBRARY_PATH 指向库的位置。
小心使用 LD_LIBRARY_PATH- 简而言之(来自链接):
..影响..:
Security:还记得 LD_LIBRARY_PATH 中指定的目录在标准位置之前(!)被搜索吗?在那里面
这样,一个讨厌的人可能会让你的应用程序加载一个版本
包含恶意代码的共享库!这就是原因之一
setuid/setgid 可执行文件确实忽略了该变量!
表现:链接加载器必须搜索所有指定的目录,直到找到共享库所在的目录
驻留 – 对于应用程序链接的所有共享库!
这意味着对 open() 的大量系统调用将失败
“ENOENT(没有这样的文件或目录)”!如果路径包含很多
目录,调用失败的次数会线性增加,并且
您可以从应用程序的启动时间看出这一点。如果有一些
(或所有)目录都在 NFS 环境中,启动时
您的应用程序的时间确实会变长 - 并且会减慢
整个系统!
不一致: 这是最常见的问题。 LD_LIBRARY_PATH 强制应用程序加载未链接的共享库
反对,这很可能与原始版本不兼容
版本。这可以是非常明显的,即应用程序
崩溃,或者如果拾取的库不正确,可能会导致错误的结果
完全符合原始版本的要求。尤其是
后者有时很难调试。
OR
通过 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)