MacOS Sonoma(M1 Pro)下sudo make install安装Z3后动态库加载失败
问题背景
通过源码执行sudo make install安装Z3后,编译示例或自定义程序成功,但运行时出现动态库加载错误:
Library not loaded: libz3.dylib Referenced from: <856829F0-D35A-383B-8D63-7734D9099FC4> /my_path/cpp_example Reason: tried: 'libz3.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OSlibz3.dylib' (no such file), 'libz3.dylib' (no such file), '/my_path/libz3.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS//my_path/libz3.dylib' (no such file), '/my_path/libz3.dylib' (no such file)
复制libz3.dylib到程序目录可临时解决,以下是更优雅的方案:
解决方案
1. 全局配置动态库搜索路径
- 确认Z3库的安装路径,默认
sudo make install会将libz3.dylib安装到/usr/local/lib - 打开终端,编辑zsh配置文件:
nano ~/.zshrc - 添加以下内容:
export DYLD_LIBRARY_PATH="/usr/local/lib:$DYLD_LIBRARY_PATH" - 保存后生效配置:
source ~/.zshrc - 此方法全局生效,适合频繁使用Z3的场景
2. 编译时指定动态库搜索路径(推荐)
编译程序时,通过-rpath参数让生成的可执行文件自带库路径,无需依赖环境变量:
g++ cpp_example.cpp -o cpp_example -lz3 -Wl,-rpath,/usr/local/lib
替换/usr/local/lib为你的Z3实际库路径,编译后的程序会自动到指定路径加载libz3.dylib
3. 修复Z3安装的库路径
如果sudo make install未将库放到系统默认搜索目录:
- 手动复制库到系统目录:
sudo cp /path/to/z3/build/libz3.dylib /usr/local/lib - 更新系统动态库缓存:
sudo update_dyld_shared_cache
4. 修改已编译程序的库引用路径
若已编译好程序不想重新编译,使用install_name_tool修改程序的库指向:
install_name_tool -change libz3.dylib /usr/local/lib/libz3.dylib ./cpp_example
执行后程序会直接去指定绝对路径加载动态库
原因说明
MacOS的动态库搜索优先级中,默认未将/usr/local/lib纳入自动搜索范围,而Z3的make install流程未自动为编译后的程序设置rpath,导致运行时无法定位库文件。
内容的提问来源于stack exchange,提问作者Luisa Cicolini

