Linux: 为什么加载程序找到我的共享库?
Linux: Why loader finds my shared library?
我用 CMake 编译了一个共享库作为子项目,然后主应用程序链接到该库。库和应用程序位于我的主目录下某处的同一输出目录中。
因为我在 Linux 我现在不明白为什么加载程序会看到我的库。
当我用 ldd 检查库时,一切正常。但是,我的印象是我必须设置 LD_LIBRARY_PATH 以便我的应用程序可以从同一目录加载共享库。但我没有设置它,它仍然有效。为什么?
也许您的构建过程正在您的可执行文件中设置 RPATH
以在同一目录中查找库。要对此进行测试,请尝试将可执行文件移动到不同的目录,然后看看是否可以 运行 它(或 ldd
它)。
您还可以通过以下任一方式检查可执行文件中的 RPATH
:
readelf -d the-exe | grep RPATH
objdump -x the-exe | grep RPATH
有关这方面的更多信息,请参阅此处:https://unix.stackexchange.com/questions/22926/where-do-executables-look-for-shared-objects-at-runtime
我用 CMake 编译了一个共享库作为子项目,然后主应用程序链接到该库。库和应用程序位于我的主目录下某处的同一输出目录中。
因为我在 Linux 我现在不明白为什么加载程序会看到我的库。
当我用 ldd 检查库时,一切正常。但是,我的印象是我必须设置 LD_LIBRARY_PATH 以便我的应用程序可以从同一目录加载共享库。但我没有设置它,它仍然有效。为什么?
也许您的构建过程正在您的可执行文件中设置 RPATH
以在同一目录中查找库。要对此进行测试,请尝试将可执行文件移动到不同的目录,然后看看是否可以 运行 它(或 ldd
它)。
您还可以通过以下任一方式检查可执行文件中的 RPATH
:
readelf -d the-exe | grep RPATH
objdump -x the-exe | grep RPATH
有关这方面的更多信息,请参阅此处:https://unix.stackexchange.com/questions/22926/where-do-executables-look-for-shared-objects-at-runtime