macos 不支持 ld_library_path,而使用 dyld_library_path;但受 sip 限制,普通程序无法生效,推荐用 -rpath 编译时固化路径或 install_name_tool 修改 rpath。

macOS 不支持 LD_LIBRARY_PATH 环境变量,这是 Linux 系统使用的动态链接器搜索路径机制。macOS 的动态链接器是 dyld,它使用完全不同的环境变量和查找规则。
macOS 对应的环境变量是 DYLD\_LIBRARY\_PATH
如果你希望在运行时让可执行文件优先从指定目录加载动态库(.dylib),可以设置:
DYLD_LIBRARY_PATH=/path/to/your/libs- 多个路径用冒号
:分隔,例如:DYLD_LIBRARY_PATH="/opt/mylib:/usr/local/lib" - 该变量仅对当前 shell 及其子进程生效,建议临时使用:
export DYLD_LIBRARY_PATH="/path/to/libs"; ./myprogram
注意系统完整性保护(SIP)和安全限制
macOS 10.11+ 默认启用 SIP,它会忽略大多数进程(包括非 root 用户启动的程序)的 DYLD_* 变量,除非满足以下条件之一:
- 程序由 root 用户运行(如
sudo),且未被 SIP 保护(如系统路径外的自定义二进制) - 程序已通过
codesign移除restrictedentitlement(不推荐普通用户操作) - 你禁用了 SIP(强烈不建议,会降低系统安全性)
更可靠、推荐的替代方案
避免依赖环境变量,改用编译或安装时固化路径的方式:
-
编译时指定运行时路径:用
-rpath(推荐)clang -o myapp main.c -L/path/to/lib -lmylib -Wl,-rpath,/path/to/lib -
修改已有二进制的 rpath:
install_name_tool -add_rpath /path/to/lib myapp -
设置库自身的 install_name(适用于你控制的 .dylib):
clang -dynamiclib -install_name @rpath/libmylib.dylib ... - 使用 @executable_path / @loader_path 实现相对路径查找,提升可移植性
验证 dyld 是否实际加载了你的库
运行程序前加上调试标志,查看动态链接过程:
-
DYLD_PRINT_LIBRARIES=1 ./myapp— 显示所有加载的库 -
DYLD_PRINT_LIBRARIES_POST_LAUNCH=1 ./myapp— 仅显示主程序启动后加载的 -
otool -l ./myapp | grep -A2 LC_RPATH— 查看二进制中是否嵌入了 rpath -
dyld_info -dylibs ./myapp(需安装dyldinfo工具)— 更详细的依赖分析










