Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Linux:为什么loader会找到我的共享库?_C++_Linux_Shared Libraries_Ubuntu 14.04 - Fatal编程技术网

C++ Linux:为什么loader会找到我的共享库?

C++ Linux:为什么loader会找到我的共享库?,c++,linux,shared-libraries,ubuntu-14.04,C++,Linux,Shared Libraries,Ubuntu 14.04,我已经将CMake作为一个子项目编译了一个共享库,然后主应用程序链接到该库。库和应用程序位于my home目录下的同一输出目录中 因为我在Linux上,我现在不明白为什么加载程序会看到我的库 当我与ldd检查LIB时,一切正常。然而,我的印象是,我必须设置LD_LIBRARY_PATH,以便我的应用程序可以从同一目录加载共享库。但我还没有设置它,它仍然有效。为什么?也许您的构建过程正在可执行文件中设置RPATH,以便在同一目录中查找库。要测试这一点,请尝试将可执行文件移动到其他目录,然后查看是否

我已经将CMake作为一个子项目编译了一个共享库,然后主应用程序链接到该库。库和应用程序位于my home目录下的同一输出目录中

因为我在Linux上,我现在不明白为什么加载程序会看到我的库


当我与ldd检查LIB时,一切正常。然而,我的印象是,我必须设置LD_LIBRARY_PATH,以便我的应用程序可以从同一目录加载共享库。但我还没有设置它,它仍然有效。为什么?

也许您的构建过程正在可执行文件中设置
RPATH
,以便在同一目录中查找库。要测试这一点,请尝试将可执行文件移动到其他目录,然后查看是否可以运行它(或
ldd
it)

您还可以通过以下任一方式检查可执行文件中的
RPATH

readelf -d the-exe | grep RPATH
objdump -x the-exe | grep RPATH

有关这方面的更多信息,请参见此处:

CMake设置makefiles以添加一个选项,供链接器告知共享库的位置。搜索
ld
选项
--rpath
。是否使用
-L
-L
进行链接?另一种方法是直接使用其完整路径和名称链接.so。如果CMAKE使用其完整路径和名称链接.so,则在加载时不会进行搜索。它只是使用了相同的完整路径和名称。@JSF不,它似乎使用了-Wl,-rpath.Or运行
readelf-d./thebinary | grep rpath
。automake/autoconf通常会自动嵌入RPATH,以便您可以轻松地从项目文件夹中运行已编译的应用程序,并在
make install
期间重新链接它以排除RPATH(如果DESTDIR位于不需要RPATH的公共位置),我怀疑CMake具有类似的automagic智能。@否:谢谢,我添加了您的
readelf
想法以及
objdump
备选方案。