如何让CMake构建一个支持MPI的Fortran程序?

时间:2013-05-04 14:55:51

标签: 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文件。

3 个答案:

答案 0 :(得分:2)

我在我的CMakeLists.txt文件中插入了“message”命令,并打印出我用于包含和链接的变量值。事实证明,变量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版本。

答案 1 :(得分:1)

听起来你没有使用mpi编译器。这很好,但你必须添加很多标志。没有真正的mpi编译器,但是包装器将标志设置为能够使用mpi。使用cmake,我可以通过在调用cmake之前定义我将要使用的fortran编译器来完成此操作。它不是一个很好的解决方案,因为你松散了可移植性,但它的工作原理。我正在尝试找到一个更好的解决方案并在cmake中定义要使用的编译器,但是无法这样做。换句话说,这对我有用:

    FC=mpif90 cmake ../.
    make

我遇到了和你一样的问题。希望这能解决问题。如果有人发现如何定义fortran编译器INSIDE cmake请发布它!

答案 2 :(得分:0)

正如您已经注意到的那样,您错误拼写了两个变量的名称,即MPI_Fortran_LIBRARIESMPI_Fortran_LIBRARIES

添加:

也很有用
cmake_minimum_required(VERSION 2.8.10)

在你的CMake的最开始,以确保定义这些变量。