Conda提供的gfortran编译MPI程序失败,导入时出现未定义符号错误
解决MPI Fortran Python封装导入时的未定义符号错误
问题出在哪
你之前只在编译阶段指定了MPI头文件的路径,但链接阶段没有关联MPI的库文件——编译只需要头文件做函数声明,可程序导入时得找到实际的库实现才行,这就导致生成的Python扩展找不到mpi_allreduce_这类MPI符号。
一步步解决
1. 找到conda环境里的MPI库位置
先激活你的conda环境,执行这条命令就能拿到库路径:
echo $CONDA_PREFIX/lib
这个目录下肯定有libmpi.so(Linux环境)这类MPI库文件。
2. 补全编译和链接参数
不管用Makefile还是setup.py,都得同时添加三类参数:
- 头文件路径:
-I${CONDA_PREFIX}/include - 库文件路径:
-L${CONDA_PREFIX}/lib - 链接MPI库:
-lmpi
改Makefile的示例
调整编译链接命令,把MPI参数加进去:
FC = gfortran # 统一定义MPI相关编译链接参数 MPI_FLAGS = -I${CONDA_PREFIX}/include -L${CONDA_PREFIX}/lib -lmpi # 编译生成共享库 your_module.so: your_fortran_code.f90 $(FC) -shared -fPIC $< $(MPI_FLAGS) -o $@
改setup.py的示例
如果用setuptools的Extension模块,要在编译和链接参数里都配置:
from setuptools import setup, Extension mpi_inc = '-I${CONDA_PREFIX}/include' mpi_lib = ['-L${CONDA_PREFIX}/lib', '-lmpi'] ext = Extension( 'your_python_package', sources=['your_fortran_code.f90'], extra_compile_args=[mpi_inc], extra_link_args=mpi_lib, language='fortran' ) setup(name='your_python_package', ext_modules=[ext])
3. 确保MPI环境统一
别混用系统自带的MPI和conda环境的MPI,激活conda环境后再执行所有编译命令,用环境内的mpirun、gfortran工具。可以用这条命令确认环境中的MPI版本:
mpirun --version
4. 重新编译安装
先删除之前生成的编译产物(比如.o、.so文件和build目录),再重新执行:
python setup.py install
额外提醒
如果是用f2py封装Fortran代码,要这样传递MPI参数:
f2py -c -m your_module your_code.f90 --f90flags="-I${CONDA_PREFIX}/include" --linkflags="-L${CONDA_PREFIX}/lib -lmpi"
内容的提问来源于stack exchange,提问作者johnhenry
相关产品推荐
相关产品推荐

