ORCA 在 macOS 上运行出现 动态库找不到 libmpi.40.dylib 问题排查与解决。 #
一、问题 #
运行ORCA时出现如下错误:
dyld[xxxx]: Library not loaded: libmpi.40.dylib
Referenced from: /Users/user/Software/orca611/orca_startup_mpi
Reason: tried: 'libmpi.40.dylib' (no such file),
'/usr/local/lib/libmpi.40.dylib' (no such file),
'/usr/lib/libmpi.40.dylib' (no such file, not in dyld cache)
...
ORCA finished by error termination同时,即使设置了DYLD_LIBRARY_PATH,otool -L检查依赖仍是libmpi.40.dylib(无路径),且报错信息中并未出现设置的路径。
二、原因分析 #
1. ORCA二进制文件问题 #
使用otool -L检查ORCA的可执行文件:
otool -L /Users/user/Software/orca611/orca_startup_mpi输出:
libmpi.40.dylib (compatibility version 71.0.0, current version 71.1.0)说明ORCA在编译时只记录了库名,未指定路径或rpath,导致dyld只能搜索系统路径。
2. 自编译的 OpenMPI 和 MPICH、Conda OpenMPI与混用 #
- 之前安装过MPICH和Conda版OpenMPI,导致环境变量和路径混乱
- 不同MPI实现的库名虽然都是
libmpi.40.dylib,但ABI不兼容,可能引起段错误或库加载失败
三、排查步骤 #
1. 检查当前DYLD_LIBRARY_PATH
#
echo $DYLD_LIBRARY_PATH
/Users/user/Software/openmpi-4.1.1-install/lib:/Users/user/Software/orca611/lib:2. 检查MPI库是否存在 #
ls /Users/user/Software/openmpi-4.1.1-install/lib/libmpi*.dylib库文件存在,说明问题在链接而非缺失。
3. 查看ORCA的库依赖 #
otool -L /Users/user/Software/orca611/orca_startup_mpi
otool -L /Users/user/Software/orca611/orca_guess_mpi发现所有MPI相关的可执行文件和.dylib都只依赖libmpi.40.dylib(无路径)。
4. 尝试修改主程序rpath #
install_name_tool -add_rpath /Users/user/Software/openmpi-4.1.1-install/lib orca_startup_mpi虽然成功添加rpath,但运行时仍报错,说明dyld未使用该rpath(SIP/硬化运行时干扰)。
5. 尝试install_name_tool -change(关键步骤)
#
install_name_tool -change libmpi.40.dylib /Users/user/Software/openmpi-4.1.1-install/lib/libmpi.40.dylib orca_startup_mpi此时主程序可以运行,但orca_guess_mpi仍报错。说明所有相关二进制都需要修复。
四、解决方案 #
批量修改所有ORCA二进制文件的库引用 #
改为绝对路径使用 libmpi.40.dylib
cd /Users/user/Software/orca611
find . -type f \( -perm +111 -o -name "*.dylib" \) | while read file; do
echo "Checking $file..."
# 修复 libmpi 依赖
if otool -L "$file" 2>/dev/null | grep -q "libmpi.40.dylib"; then
echo " Fixing $file"
install_name_tool -change libmpi.40.dylib \
/Users/user/Software/openmpi-4.1.1-install/lib/libmpi.40.dylib "$file" 2>/dev/null
fi
# 修复 @rpath 依赖
if otool -L "$file" 2>/dev/null | grep -q "@rpath"; then
echo " Fixing rpath in $file"
install_name_tool -add_rpath /Users/user/Software/orca611 "$file" 2>/dev/null
fi
done