2013-05-04 67 views
2

我试图使用MPI并行化Fortran程序。我使用CMake来构建我的程序。这是很难找到让CMake的创建与Fortran语言对谷歌MPI支持工作makefile文件的支持,但是从我可以收集,我添加了以下命令来我的CMakeLists.txt脚本:如何让CMake构建一个支持MPI的Fortran程序?

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文件。

回答

2

我插入的“信息”命令到我的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.h以及mpi.mod

UPDATE:

我想提一提,这个解决方案为cmake的版本2.8.10.1。当我提出我的CMakeLists.txt脚本不同的机器有cmake的版本2.8.4,我得到了同样的错误关于在链接阶段mpi.mod失踪。我检查了FindMPI.cmake模块,当然,没有指定语言的变量(即没有变量MPI_Fortran_LIBRARIES,只是MPI_LIBRARIES变量,并且该变量没有被设置为该mpi库的正确位置系统,所以这个解决方案将取决于cmake版本

1

听起来就像你没有使用mpi编译器那很好,但你必须添加很多的标志然后没有一个真正的mpi编译器,但一个包装器设置标志可以使用mpi。通过cmake,我可以通过定义fortran编译器来实现这一点,我将在调用cmake之前使用它。这不是一个很好的解决方案,因为你松散的可移植性,但它的工作原理。我试图找到一个更好的解决方案,并在cmake中定义要使用的编译器,但一直未能这样做。换句话说,这适用于我:

FC=mpif90 cmake ../. 
    make 

我和你有同样的问题。希望这可以解决这个问题。如果有人发现如何定义Fortran编译器INSIDE cmake,请发布!

0

因为你已经注意到了,你拼错了两个变量,即MPI_Fortran_LIBRARIESMPI_Fortran_LIBRARIES

它是有用的名字也补充:

cmake_minimum_required(VERSION 2.8.10) 

在你的CMake一开始是确定这些变量将被定义。