CMake:手动设置MPI标头和二进制文件的路径

M4u*_*ice 4 c++ cmake mpi

我正在开发一个MPI应用程序,它需要运行MPI的特定实现(让我们称之为MPIvA).在我的工作站上,安装了MPI的另一个实现(我们称之为MPIvB).

我的应用程序是使用CMake构建的,find_library(MPI)显然指向MPIvB.它编译和运行没有麻烦.

我在我的工作站上编译了MPIvA.如何让CMake使用这些头文件和二进制文件?

Pat*_*ick 7

CMake附带一个FindMPI模块,可以为您完成所有繁重的工作.

在你的CMakeLists.txt中,不要find_library(MPI)使用,而是使用find_package如下:

#### MPI
find_package(MPI REQUIRED)
if (MPI_FOUND)
    include_directories(SYSTEM ${MPI_INCLUDE_PATH})
else (MPI_FOUND)
    message(SEND_ERROR "This application cannot compile without MPI")
endif (MPI_FOUND)
Run Code Online (Sandbox Code Playgroud)

然后,只要您链接您的应用程序,请链接到${MPI_LIBRARIES}:

target_link_libraries(example-app ${MPI_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)

现在的cmake会自动找到一个系统中的MPI实现.如果您有多个不同的MPI版本,并且想要指定要编译哪个版本,则可以将MPI_C_COMPILERMPI_CXX_COMPILER变量设置为相应的mpiccmpicxx编译器包装器.然后,CMake模块将使用它们来确定所有必需的编译器和链接器标志本身.

例:

cmake -DMPI_C_COMPILER=/usr/share/mvapich/bin/mpicc your-project-dir
Run Code Online (Sandbox Code Playgroud)

要确保cmake使用正确的MPI,请从新的空构建目录开始.

有关FindMPI模块的更多信息,请访问:https://cmake.org/cmake/help/v3.0/module/FindMPI.html


pat*_*osn 0

好吧,这不是一个新帖子,但将来可能对其他人有用。

尽管前面的答案也可以工作,但我认为更好的方法是使用CMAKE_PREFIX_PATH选项,即类似

CMAKE_PREFIX_PATH=~/my-libs-install-path ccmake ..
Run Code Online (Sandbox Code Playgroud)

现在,还有一些其他评论:

  1. 所有 MPI 库都应该是可互换的,即使用 MPI 规范的代码应该与任何 MPI 实现一起编译和运行(例如,我假设是 intelmpi、openmpi 或 mpich 的 MPIvA 和 MPIvB)。

  2. 关于这个答案(我的声誉不允许我发表评论,所以我在这里回复):

find_package(MPI REQUIRED)
if (MPI_FOUND)
    include_directories(SYSTEM ${MPI_INCLUDE_PATH})
else (MPI_FOUND)
    message(SEND_ERROR "This application cannot compile without MPI")
endif (MPI_FOUND)
Run Code Online (Sandbox Code Playgroud)

尽管功能大部分符合预期,但以下内容在功能上是等效的:

find_package(MPI REQUIRED)
include_directories(SYSTEM ${MPI_INCLUDE_PATH})
Run Code Online (Sandbox Code Playgroud)

如果未找到 MPI,findpackage(MPI REQUIRED)命令中的 REQUIRED 部分将导致命令失败,因此if(MPI_FOUND)部分无用,并且 else 子句实际上永远不会被执行

  1. 最后,关于include_directories命令,在我的测试中,如果您使用目标,则不需要,例如

    target_link_libraries(my_app PUBLIC MPI::C)

足够。