提问人:nano 提问时间:11/14/2023 最后编辑:nano 更新时间:11/15/2023 访问量:65
避免针对@rpath的 CMAKE 链接,而是使用绝对路径
Avoid CMAKE linking against @rpath and use absolute paths instead
问:
建
我正在构建一个 CMAKE 可执行文件并链接到外部库。
对于该库,我有一个自定义的 FindMYLIB cmake scribt,可以成功设置变量。PROMTINGMYLIB_LIBRARIES
MESSAGE("${MYLIB_LIBRARIES}")
正确屈服
/usr/local/lib/libmylib.dylib
我使用
target_link_libraries(my_executable
${MYLIB_LIBRARIES}
)
在我的工具链或CMAKE代码中,没有设置任何自定义设置。RPATH
问题
运行它给了我错误
dyld[94833]: Library not loaded: @rpath/libmylib.dylib
Referenced from: <3747E824-3D4B-38A3-BFD8-E96891349DD5> /path/to/my_executable
Reason: no LC_RPATH's found
在检查链接的内容时,我阅读了
$ otool -L /path/to/my_executable
/path/to/my_executable:
...
@rpath/libmylib.dylib (compatibility version 0.0.0, current version 0.0.0)
...
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1600.151.0)
以下情况不会发生,并且缺少
$ otool -l /path/to/my_executable
[...]
Load command NN
cmd LC_RPATH
cmdsize 32
path /usr/local/lib (offset 12)
缓解
我发现以下方法通过显式设置来修复可执行文件:LC_RPATH
install_name_tool -add_rpath /usr/local/lib /pyth/to/my_executable
问题
如何首先避免使用链接,而是使用绝对路径?既然 CMAKE 拥有绝对路径,那么它们如何最终成为相对链接?@rpath
在另一台机器上构建相同的路径只会生成绝对路径。
设置
Mac OSX,M1 CMake 3.23.2 苹果克朗 15
更多细节
我有一个象征性的链接libmylib.dylib -> libmylib-XX.YY.ZZ.dylib
第一个出现在 CMAKE 中,第二个作为链接名称出现。
目前未成功
多个 CMAKE 标志,包括CMAKE_SKIP_RPATH
编辑 1
set(CMAKE_EXE_LINKER_FLAGS "-Wl,-rpath,/usr/local/lib")
使可执行文件运行。
它缓解了没有 rpath 的问题,但不能解决我安装 rpath 的问题。/usr/local/lib
编辑 2
最小示例
# CMakeLists.txt
cmake_minimum_required(VERSION 3.12)
project(test_exe)
add_executable(test_exe main.cpp)
target_include_directories(test_exe
PRIVATE /usr/local/include)
target_link_libraries(test_exe
PRIVATE
/usr/local/lib/libmylib.dylib
)
// main.cpp
#include <mylib/version.hxx>
int main()
{
return 0;
}
连接:
/usr/bin/c++
-g
-arch
arm64
-isysroot
/Library/Developer/CommandLineTools/SDKs/MacOSX14.0.sdk
-Wl,-search_paths_first
-Wl,-headerpad_max_install_names
CMakeFiles/test_exe.dir/main.cpp.o
-o
test_exe
/usr/local/lib/libmylib.dylib
$ otool -L ./cmake-build-debug/test_exe
@rpath/libmylib.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1600.151.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1336.0.0)
编辑 3
$ otool -L /usr/local/lib/libmylib.dylib
@rpath/libmylib.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1600.151.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1336.0.0)
因此,该库将自己的名字称为 rpath-stuff。
重命名其内部使用
install_name_tool -id
/usr/local/lib/libmylib.dylib
/usr/local/lib/libmylib.dylib
在某些情况下,让它指向其绝对路径可以解决问题。
我的可执行文件链接到并找到它。/usr/local/lib/libmylib.dylib
但它仍然无法运行,因为其他几个 .dylib 被引用。我必须破解所有这些。这里的关键问题是我对我的包提供者 (build2) 构建库的方式不满意。libmylib.dylib
答: 暂无答案
评论
make
/usr/local/lib
/usr/local/lib
rpath
/etc/ld.so.conf