我正在 m2 mac 上编译一个简单的 C 程序,该程序依赖于 macOS 上使用 clang 的共享库。我使用 -Wl,-rpath,@executable_path/../saga 标志正确设置 rpath。我已经通过使用 otool 检查可执行文件来验证这一点,它显示了正确的 rpath。
但是,当我尝试运行该程序时,动态链接器(dyld)在指定路径中找不到该库。仅当我将 DYLD_LIBRARY_PATH 环境变量设置为库 (libdynamiclib.dylib) 所在的位置时,该程序才有效。
为什么 dyld 不使用我设置的 rpath?我是否设置了错误的rpath?
这是我用来编译程序的命令:
clang -I../saga -L../saga -ldynamiclib -Wl,-rpath,@executable_path/../saga -o main main.c
Rpath 仅对于实际使用
@rpath
的查找很重要,但看起来你的库并不重要。它的安装名称只是libdynamiclib.dylib
,但它需要是@rpath/libdynamiclib.dylib
。
运行此命令,然后重新编译您的主二进制文件:
install_name_tool -id '@rpath/libdynamiclib.dylib' ../saga/libdynamiclib.dylib
codesign -s - -f -o linker-signed ../saga/libdynamiclib.dylib
(第二个命令只是更新默认的链接器生成的签名,如果您有自己的协同签名过程,那么显然只需使用它即可。)