我正在尝试使用 MPI 并行化 Fortran 程序。我使用 CMake 来构建我的程序。很难在谷歌上找到支持让 CMake 为具有 MPI 支持的 Fortran 创建工作 makefile 的支持,但据我所知,我将以下命令添加到我的 CMakeLists.txt 脚本中:
find_package(MPI REQUIRED)
add_definitions(${MPI_Fortran_COMPILE_FLAGS})
include_directories(${MPI_Fortran_INCLUDE_DIRS})
link_directories(${MPI_FortranLIBRARY_DIRS})
这将在我的系统上找到 MPI,然后设置在以下三个命令中找到的变量。在我的链接行中,我将 MPI 库变量添加到我的程序需要构建的其他库的列表中。
target_link_libraries(${exe_name} otherlibs ${MPI_FortranLIBRARY_DIRS})
执行 cmake
然后 make
构建程序并运行;但是,当我尝试向源代码中添加更多内容时,需要我包含 mpif.h
包含文件,但由于无法找到此头文件,我的编译失败了。我也无法 use mpi
因为编译器无法在路径中找到 mpi.mod
文件。
最佳答案
我将“消息”命令插入到我的 CMakeLists.txt 文件中,并打印出我用于包含和链接的变量值。结果是变量 MPI_Fortran_INCLUDE_DIRS
和 MPI_FortranLIBRARY_DIRS
没有设置任何值。检查 CMake 实际用于设置这些变量的模块 (FindMPI.cmake) 显示这些变量不存在。我更改了 CMakeLists.txt 文件以使用正确的变量:
find_package(MPI REQUIRED)
add_definitions(${MPI_Fortran_COMPILE_FLAGS})
include_directories(${MPI_Fortran_INCLUDE_PATH})
link_directories(${MPI_Fortran_LIBRARIES})
target_link_libraries(${exe_name} otherlibs ${MPI_Fortran_LIBRARIES})
现在,当我执行 make
时,编译器可以同时找到 mpif.h
和 mpi.mod
。
更新:
我想提一下,此解决方案适用于 cmake 版本 2.8.10.1。当我将我的 CMakeLists.txt 脚本移动到另一台具有 cmake 版本 2.8.4 的机器时,我在链接阶段遇到关于 mpi.mod
丢失的相同错误。我检查了 FindMPI.cmake 模块,果然,没有指定语言的变量(即没有 MPI_Fortran_LIBRARIES
变量,只有一个 MPI_LIBRARIES
变量,而这个变量未设置到该系统上 mpi 库的正确位置。因此此解决方案将取决于 cmake 版本。
关于cmake - 如何让 CMake 构建具有 MPI 支持的 Fortran 程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16375596/