Skip to main content

Orca 找不到 libmpi.40.dylib

·760 words·2 mins
葛世杰
Author
葛世杰
Student @ Soochow
Table of Contents

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_PATHotool -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