dyld: library not loaded 错误核心是运行时路径不匹配,需三步排查:先用otool -l查编译时依赖路径,再用dyld_print_libs=1验证实际加载路径,最后用otool -l检查lc_rpath是否存在并用install_name_tool补全。
遇到 dyld: library not loaded 报错,核心是动态链接器在运行时找不到或加载错了 dylib。这不是代码问题,而是路径记录和实际位置对不上。排查要分三步走:看它“说找谁”、查它“实际找哪”、确认它“有没有权限找”。
第一步:用 otool -L 查清二进制里写死的依赖路径
这是起点。打开终端,运行:
otool -L /path/to/your/executable
重点关注输出中每行 dylib 的路径形式:
- 以
/usr/local/lib/xxx.dylib或/opt/homebrew/lib/xxx.dylib开头 → 是硬编码绝对路径,换机器大概率失效 - 以
@rpath/xxx.dylib开头 → 路径可变,但必须有对应LC_RPATH加载命令支持 - 以
@executable_path/../Frameworks/xxx.dylib开头 → 相对主程序位置,通常安全 - 只有文件名如
libxxx.dylib→ 链接时没指定路径,运行时只查系统默认路径(/usr/lib、/lib),基本会失败
第二步:用 dyld_print_libs 看它真正加载了哪个文件
otool -L 显示的是编译时记下的“愿望”,而真实行为可能被环境变量或 rpath 干扰。验证实际加载路径:
dyld_print_libs=1 ./your_executable 2>&1 | grep libname
比如查 OpenSSL:
dyld_print_libs=1 ./myapp 2>&1 | grep libssl
如果输出是 /usr/lib/libssl.dylib,但你期望的是 Homebrew 安装的 /opt/homebrew/lib/libssl.dylib,说明 rpath 没生效、或被 DYLD_LIBRARY_PATH 覆盖、或系统库优先级更高。
第三步:检查 rpath 是否写入且有效
运行:
otool -l ./your_executable | grep -A2 LC_RPATH
如果没有输出,说明二进制里根本没存任何运行时搜索路径,@rpath 就是空话。此时需补加:
install_name_tool -add_rpath "@executable_path/../Frameworks" ./your_executable
或者指向 Homebrew 路径:
install_name_tool -add_rpath "/opt/homebrew/lib" ./your_executable
补完后再次运行上条命令,确认新路径已出现在 LC_RPATH 列表中。
顺手检查库文件自身是否合规
如果依赖的 dylib 本身也有问题,整个链就断了。对每个关键 dylib 执行:
otool -D libxxx.dylib → 看它的 install name 是不是也用了 @rpath 或合理路径
otool -L libxxx.dylib → 看它自己又依赖哪些库,那些是否也都配置好了
若发现 install name 是绝对路径但不通用,用 install_name_tool -id "@rpath/libxxx.dylib" libxxx.dylib 重设;若它内部引用了旧路径,再用 -change 修正。










