Rpath/Runpath 处理 CMAKE 中的依赖共享库

Rpath/Runpath handle with dependent shared libraries in CMAKE

我会把你放在上下文中:

我有 2 个第三方共享库:libA.solibB.so。我的程序只包含对 libA.so 符号的调用。 libA.so 内部需要调用 libB.so。如果我 readelf LibA.so 它有一个 RunPath 指向我的系统中不存在的第三方开发人员的路径。

我的程序是用 cmake 构建的。我使用 find_library(A)find_libary(B),然后使用 target_link_libraries(my_executable PUBLIC A B)

将它们添加到我的程序可执行目标

使用此设置,生成的可执行文件包含 libA.so 和 libB.so 的正确运行路径。问题是当 运行 可执行文件 找不到 libB.so 文件时 .

我需要将 .so 文件保留在原处。设置 LD_LIBRARY_PATH env 变量或移动到 ldd 有效文件夹不是一个选项。我已经尝试过这些解决方案,顺便说一句,它们很有效。

在这种情况下,我如何让可执行文件找到 libB.so。

提前致谢。

您可以使用名为 patchelf:

的工具更改 RPATH
sudo apt install patchelf
patchelf --set-rpath $ORIGIN libMyLibrary.so

注意$ORIGIN这里的意思是“在这个库所在的文件夹中搜索”。您还可以像这样组合值:$ORIGIN:$ORIGIN/../lib。如果您想保留 unix-like 安装结构([=13= 中的可执行文件],lib 中的库),这很方便。