将路径添加到新库的位置LD_LIBRARY_PATH
(在Mac上名称稍有不同...)
您的解决方案应该使用这些-L/my/dir -lfoo
选项,在运行时使用LD_LIBRARY_PATH指向您的库的位置。
谨慎使用LD_LIBRARY_PATH-简而言之(来自链接):
..implications ..:
安全性:还记得在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
等?