cmake - 如何让 CMake 构建具有 MPI 支持的 Fortran 程序?

标签 cmake fortran mpi

我正在尝试使用 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_DIRSMPI_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.hmpi.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/

相关文章:

c++ - 如何使用 CMake 生成面向 Windows XP 的 Visual Studio 2012 项目?

c++ - gfortran makefile 问题

multithreading - 消息传递任意对象图?

c++ - Clion "Cannot load CMake project: CMake executable is incorrect"问题

c++ - 使用 CMake 链接到 cocoa 库(C++ 与 Objective-C 混合)

compiler-errors - 编译器无法识别显式类型

c++ - 如何在 C++ 中获得与 Fortran 相同的实值精度(Parallel Studio XE Compiler)

c++ - CMake:手动设置 MPI header 和二进制文件的路径

c - 具有 2D 数组的 MPI_Allgather

cmake - 将 CMake 与具有钻石依赖项的库一起使用