libtbbmalloc.so.2
,所以它无法运行:/tests: error while loading shared libraries: libtbbmalloc.so.2: cannot open shared object file: No such file or directory`
当我在可执行文件上运行ldd
时,会得到以下结果:
linux-vdso.so.1 (0x00007fffeb572000)
libtbbmalloc_proxy.so.2 => /home/username/dev/tbb/libtbbmalloc_proxy.so.2 (0x00007f50afe00000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f50afa70000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f50af6d0000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f50af4b0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f50af0a0000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f50aee90000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f50aec70000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f50aea60000)
/lib64/ld-linux-x86-64.so.2 (0x00007f50b0400000)
libtbbmalloc.so.2 => not found
我的测试项目的CMakeLists.txt文件如下所示:
set(test_sourcefiles main_tests.cpp)
add_executable(tests ${test_sourcefiles})
target_link_libraries(tests Catch2::Catch2 MyLib)
MyLib使用了tbb,我猜这就是为什么我的可执行文件(tests)会搜索它。在运行ldd命令查看MyLib时,它找到了库(libtbbmalloc.so.2):
(removed some output for readability)
libtbbmalloc_proxy.so.2 => /home/username/dev/tbb/libtbbmalloc_proxy.so.2 (0x00007f9af8110000)
libtbbmalloc.so.2 => /home/username/dev/tbb/libtbbmalloc.so.2 (0x00007f9ac4eb0000)
我尝试在我的 tests/CMakeLists.txt 中特别添加了 libttbbmalloc.so.2,代码如下: target_link_libraries(${project} /home/username/dev/tbb/libtbbmalloc.so.2)
,但没有任何效果。
如果我将 /home/username/dev/tbb/
添加到 LD_LIBRARY_PATH
中,程序可以运行,并且 ldd 报告找到了 libtbbmalloc.so.2。
你有什么想法是我做错了什么,以及如何让我的程序在不设置 LD_LIBRARY_PATH
的情况下运行?
更新:我发现可以使用 chrpath -l 可执行文件名称
打印 runpath/rpath。当我在可执行文件上使用该工具时,看起来添加了包含 libtbbmalloc.so.2 的文件夹到 runpath,但程序仍然无法运行:
larjr@DESKTOP:~/dev/project/build/tests$ chrpath -l tests
tests: RUNPATH=/home/larsjr/dev/project/build/MyLib:/home/username/dev/tbb
ldd
命令都显示你的库已经正确解析(找到)。因此,如果你在相同的构建位置运行测试,它应该可以工作。@Zaffy 的回答假设你的问题是在程序安装之后。这是问题吗? - Former contributorldd
命令的输出(可能应该强调一下)表明它无法解析libtbbmalloc.so.2
。这是在构建测试项目时出现的问题吗?我不明白的是为什么一个名为MyLib的项目可以正常工作,而我的测试项目却不能。 - larsjrldd
输出表明libtbbmalloc_proxy.so.2
被正确解析,但libtbbmalloc.so.2
没有被解析!这就解释了一切。你的程序链接到代理库,因此你的程序的RPATH用于定位代理库。但是真正的库没有链接到你的程序,而是链接到代理库。代理库没有嵌入RPATH来帮助链接器定位buddy。 - Former contributorpatchelf
](http://manpages.ubuntu.com/manpages/cosmic/man1/patchelf.1.html)将代理库插入RPATH
,或者2:在您的系统上安装库到某些标准前缀,如 /usr/local/ ,并将其包含在/etc/ld.so.conf
中。 - Former contributor