在通过gcc编译代码时,我发现了一件奇怪的事情:依赖库有时在文件名(*.so)之前有一个目录,而通常它只是一个*.so相似的目录,在文件名之前没有任何目录,如下所示:
$>ldd Lib/libpagemanager.so
linux-vdso.so.1 => (0x00007ffff65ef000)
liblec.so.1 => /farequote/FQProduction/Dataware/CachingServices/Lib/liblec.so.1 (0x00007f7a897ed000)
Input_API/MFaSTDeps/Lib/./liblmdb.so => not found
liblz4.so.1 => not found
libemmalloc.so.1 => /farequote/FQProduction/MiddleWareLibs/libemmalloc.so.1 (0x00007f7a895de000)
libfqparams.so.1 => /farequote/FQProduction/MiddleWareLibs/libfqparams.so.1 (0x00007f7a89391000)
libmfastlog.so.1 => not found
libmfaststat.so.1 => not found
libstdc++.so.6 => /farequote/FQProduction/GCCRuntime/Lib/libstdc++.so.6 (0x00007f7a89189000)
libm.so.6 => /lib64/libm.so.6 (0x00007f7a88f10000)
在本例中,此库文件查找liblmdb.so,它必须来自Input_API/MFaSTDeps/Lib。其他依赖库没有此约束。
这是怎么回事?我应该怎么做才能使这个库依赖于来自LD_library_PATH中任何目录的liblmdb.so?
问题是硬编码rpath错误。
如果在没有rpath选项的情况下没有要重新编译的问题库源,请使用chrpath实用程序