Rpath/Runpath 处理 CMAKE 中的依赖共享库
Rpath/Runpath handle with dependent shared libraries in CMAKE
我会把你放在上下文中:
我有 2 个第三方共享库:libA.so 和 libB.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
中的库),这很方便。
我会把你放在上下文中:
我有 2 个第三方共享库:libA.so 和 libB.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:
的工具更改 RPATHsudo apt install patchelf
patchelf --set-rpath $ORIGIN libMyLibrary.so
注意$ORIGIN
这里的意思是“在这个库所在的文件夹中搜索”。您还可以像这样组合值:$ORIGIN:$ORIGIN/../lib
。如果您想保留 unix-like 安装结构([=13= 中的可执行文件],lib
中的库),这很方便。