我遇到了一些错误,这让我认为我的 Linux 程序没有链接到它应该链接的库。如何获得所有链接库的完整路径?我知道ldd
会给我名字,但我怎样才能用它来获得完整的路径?
谢谢。
我遇到了一些错误,这让我认为我的 Linux 程序没有链接到它应该链接的库。如何获得所有链接库的完整路径?我知道ldd
会给我名字,但我怎样才能用它来获得完整的路径?
谢谢。
实际上ldd
,它为您提供了绝对路径,其中包含它能够找到的应用程序的共享库依赖项中的任何文件名。
$ ldd v8test
linux-gate.so.1 => (0xb78b2000)
libz.so.1 => /usr/lib/libz.so.1 (0xb787e000)
librt.so.1 => /lib/i686/cmov/librt.so.1 (0xb7875000)
libcppunit-1.12.so.1 => /usr/lib/libcppunit-1.12.so.1 (0xb782c000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7604000)
libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb75dd000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb75bf000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7478000)
libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb745f000)
libboost_system-mt.so.1.38.0 => /usr/lib/libboost_system-mt.so.1.38.0 (0xb745b000)
/lib/ld-linux.so.2 (0xb78b3000)
libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb7456000)
libboost_thread-mt.so.1.38.0 => /usr/lib/libboost_thread-mt.so.1.38.0 (0xb7383000)
libboost_filesystem-mt.so.1.38.0 => /usr/lib/libboost_filesystem-mt.so.1.38.0 (0xb7370000)
libtinyxml.so.1 => /home/dmitry/tinyxml/libtinyxml.so.1 (0xb7359000)
libboost_regex-mt.so.1.38.0 => /usr/lib/libboost_regex-mt.so.1.38.0 (0xb728c000)
libmysqlclient_r.so.15 => /usr/lib/libmysqlclient_r.so.15 (0xb70a1000)
libicuuc.so.42 => /usr/lib/libicuuc.so.42 (0xb6f61000)
libicudata.so.42 => /usr/lib/libicudata.so.42 (0xb601a000)
libicui18n.so.42 => /usr/lib/libicui18n.so.42 (0xb5e6b000)
libcrypt.so.1 => /lib/i686/cmov/libcrypt.so.1 (0xb5e39000)
libnsl.so.1 => /lib/i686/cmov/libnsl.so.1 (0xb5e22000)
这些库在 中提到的路径中通过其 soname(例如 libboost_filesystem-mt.so.1.38.0)进行搜索/etc/ld.so.conf
,LD_LIBRARY_PATH
或者rpath
在二进制文件本身中设置。
如果ldd
找不到东西,它看起来像
libicuuc.so.42 => not found
在这种情况下,请考虑使用上述方法之一来提供正确的搜索路径。
ldd
当由于某种原因无法加载库时会警告您。
$ ldd v8test
./v8test: error while loading shared libraries: /home/dmitry/a/liba.so.2: invalid ELF header
当然它不能保护你免受库本身的错误。实际上,您的应用程序可能依赖于库 A 和 B,两者都依赖于某些库 C 上的不兼容版本。在这种情况下,您的程序很有可能崩溃(除非库 C 没有符号版本控制)- ldd 不是会警告你,但你应该能够在输出中看到它。
Program-Library-HOWTO将对您有用。
ldd
还要检查或动态链接器的一些选项。