使用CMake通过gfortran编译Fortran MPI程序时提示找不到MPI库
问题根源
你的报错核心原因是MPI_Fortran_LIBRARIES是CMake内部的列表变量,元素之间默认用分号分隔,你给IMPORTED_LOCATION传值时加了双引号,直接把整个列表转成了一个带分号的长字符串,gfortran会把这个字符串当成单个库文件名去查找,自然找不到对应文件。
解决步骤
- 移除你手动写的冗余MPI导入库代码,也就是以下三行:
add_library(mpi SHARED IMPORTED) set_target_properties(mpi PROPERTIES IMPORTED_LOCATION "${MPI_Fortran_LIBRARIES}" INTERFACE_INCLUDE_DIRECTORIES "${MPI_Fortran_INCLUDE_PATH}") target_link_libraries(${TARGETS} mpi)
- 直接使用FindMPI模块提供的官方导入目标,在
add_executable指令之后添加如下代码即可:
target_link_libraries(${TARGETS} PRIVATE MPI::MPI_Fortran)
这个官方目标会自动处理头文件路径、链接库、编译选项的配置,不需要你手动设置相关参数。
额外优化建议
- 把
cmake_minimum_required的版本要求提升到3.10及以上,你当前用的2.6版本是十几年前的旧版本,对Fortran、MPI的支持存在很多已知缺陷,兼容性问题较多。 - 如果你需要固定使用Release编译模式,建议在
project指令前添加set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE),不需要手动覆盖编译flag变量。 - 原有设置目标编译flag的代码可以替换为更规范的写法,避免后续添加其他编译选项时出现冲突:
target_compile_options(${TARGETS} PRIVATE $<$<CONFIG:Release>:-O3 -cpp -mcmodel=medium -fdefault-real-8 -ffree-line-length-512 -ffast-math> $<$<CONFIG:Debug>:-Og -g -cpp -mcmodel=medium -fdefault-real-8 -fcheck=all -ffree-line-length-512>)
修改完成后清空构建目录,重新执行CMake构建流程即可解决报错。
内容的提问来源于stack exchange,提问作者alie
相关产品推荐
相关产品推荐

