【问题标题】:Using CMake, Microsoft MPI and Visual Studio 2017 - cannot find mpi.h [duplicate]使用 CMake、Microsoft MPI 和 Visual Studio 2017 - 找不到 mpi.h [重复]
【发布时间】:2018-10-04 01:53:26
【问题描述】:

我正在尝试查找/开发一个非常简单的示例,说明如何将 CMake 与 Microsoft MPI 和 Visual Studio 一起使用。我的 CMake 运行良好,并且大致了解如何创建 CMake 项目。我也让 MS MPI 与 Visual Studio 一起工作,并确认我可以按照这个示例创建一个 MPI 项目: https://blogs.technet.microsoft.com/windowshpc/2015/02/02/how-to-compile-and-run-a-simple-ms-mpi-program/

我只是无法让他们一起工作。具体来说,我正在寻找将 CMake 命令放入我的 CMakeLists.txt 文件中,以在 Visual Studio 17 中启用 MS MPI 构建。我创建了一个 CMake 项目(可在此处找到:https://github.com/PSUCompBio/cmake-visualstudio-msmpi),它编译和运行良好 without 包含:

#include "mpi.h"

我构建项目的步骤是: 1.使用Cmake-GUI应用程序配置生成makefile 2. 使用 CMake-GUI 中的打开项目按钮启动 Visual Studio 2017。 3. 将HelloWorld 解决方案设置为启动项目。 4. 构建(到顶部菜单栏,然后​​构建->构建解决方案)

但是,包含 mpi.h:

#include <stdio.h>

#include "mpi.h"

int main()
{
   // printf() displays the string inside quotation
   printf("Hello, World!!\n");
   return 0;
}

找不到 mpi.h:
visual studio error from build

我的顶级 CmakeLists.txt 文件非常简单,并且确实发现 MSMPI 很好:

cmake_minimum_required(VERSION 3.0)
PROJECT (hellocmake)
ADD_SUBDIRECTORY (src)
option(ENABLE_MPI "Enable MPI parallelization" OFF)
if(ENABLE_MPI)
    if(WIN32)
        find_package(MPI REQUIRED)
        if(MPI_FOUND)
            message("Using MPI")
        endif(MPI_FOUND)
    endif(WIN32)
endif(ENABLE_MPI)

而我的项目结构是:

-CMakeLists.txt
-src
----test.cpp
----CMakeLists.txt

我的主要问题是为什么找不到 mpi.h?我可以看到 MS MPI 包含目录位于 CMake-GUI 中(见下图): CMake-GUI configure showing MS MPI include path

我需要在顶级 CMakeLists.txt 文件中放置另一个 CMake 命令吗?

下面我展示了处理 MPI 选项的 CMakeCache.txt 的一部分:

//Enable MPI parallelization
ENABLE_MPI:BOOL=ON

//Executable for running MPI programs.
MPIEXEC_EXECUTABLE:FILEPATH=C:/Program Files/Microsoft MPI/Bin/mpiexec.exe

//Maximum number of processors available to run MPI applications.
MPIEXEC_MAX_NUMPROCS:STRING=2

//Flag used by MPI to specify the number of processes for mpiexec;
// the next option will be the number of processes.
MPIEXEC_NUMPROC_FLAG:STRING=-n

//These flags will be placed after all flags passed to mpiexec.
MPIEXEC_POSTFLAGS:STRING=

//These flags will be directly before the executable that is being
// run by mpiexec.
MPIEXEC_PREFLAGS:STRING=

//MPI CXX additional include directories
MPI_CXX_ADDITIONAL_INCLUDE_DIRS:STRING=

//MPI compiler for CXX
MPI_CXX_COMPILER:FILEPATH=MPI_CXX_COMPILER-NOTFOUND

//MPI CXX compilation definitions
MPI_CXX_COMPILE_DEFINITIONS:STRING=

//MPI CXX compilation flags
MPI_CXX_COMPILE_OPTIONS:STRING=

//Path to a file.
MPI_CXX_HEADER_DIR:PATH=C:/Program Files (x86)/Microsoft SDKs/MPI/Include

//MPI CXX libraries to link against
MPI_CXX_LIB_NAMES:STRING=msmpi

//MPI CXX linker flags
MPI_CXX_LINK_FLAGS:STRING=

//If true, the MPI-2 C++ bindings are disabled using definitions.
MPI_CXX_SKIP_MPICXX:BOOL=OFF

//MPI C additional include directories
MPI_C_ADDITIONAL_INCLUDE_DIRS:STRING=

//MPI compiler for C
MPI_C_COMPILER:FILEPATH=MPI_C_COMPILER-NOTFOUND

//MPI C compilation definitions
MPI_C_COMPILE_DEFINITIONS:STRING=

//MPI C compilation flags
MPI_C_COMPILE_OPTIONS:STRING=

//Path to a file.
MPI_C_HEADER_DIR:PATH=C:/Program Files (x86)/Microsoft SDKs/MPI/Include

//MPI C libraries to link against
MPI_C_LIB_NAMES:STRING=msmpi

//MPI C linker flags
MPI_C_LINK_FLAGS:STRING=

//Location of the msmpi library for Microsoft MPI
MPI_msmpi_LIBRARY:FILEPATH=C:/Program Files (x86)/Microsoft SDKs/MPI/Lib/x86/msmpi.lib

//Value Computed by CMake
hellocmake_BINARY_DIR:STATIC=C:/Users/rhk12/code/cmake-visualstudio-msmpi/build

//Value Computed by CMake
hellocmake_SOURCE_DIR:STATIC=C:/Users/rhk12/code/cmake-visualstudio-msmpi

感谢您提出的任何建议。

【问题讨论】:

  • 除非 mpi.h 与包含它的文件位于同一文件夹中,否则您需要在其周围加上尖括号:#include mpi.h,但即使这样也假定您的 mpi 的路径。 h 文件位于包含路径中。
  • 获取tour、阅读How to Askminimal reproducible example。发布文本,而不是文本图像的链接。
  • 您需要让 cmake 使用 MPI 包装器(例如 mpicc 和朋友)而不是编译器(例如 cc 和朋友)
  • 您向我们展示了带有find_package(MPI) 调用的代码,但没有展示使用此调用结果的代码(包括目录、库等)。正是这部分负责是否会找到 MPI 标头。
  • @GillesGouaillardet 我一直在目录和网上四处寻找,似乎在使用 MS MPI 时,使用 cl 进行编译。 mpicc 甚至可以用 MS MPI 编译吗?

标签: c++ visual-studio cmake compiler-errors mpi


【解决方案1】:

我能够通过使用以下 CMakeLists.txt 来完成这项工作。

在顶级目录中,CMakeLists.txt

cmake_minimum_required(VERSION 3.0)

PROJECT (hellocmake)

option(ENABLE_MPI "Enable MPI parallelization" OFF)

if(ENABLE_MPI)
    find_package(MPI REQUIRED)
    include_directories(${MPI_INCLUDE_PATH})
    set(CMAKE_C_FLAGS "${CMAKE_FLAGS} ${MPI_FLAGS}")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MPI_CXX_FLAGS}")
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${MPI_EXE_LINKER_FLAGS}")
endif(ENABLE_MPI)

ADD_SUBDIRECTORY (src)

然后在src目录下CMakeLists.txt

ADD_EXECUTABLE(hellocmake test.cpp)

if(ENABLE_MPI)
    target_link_libraries(hellocmake ${MPI_LIBRARIES})
endif(ENABLE_MPI)

完成此操作后,我返回 CMake-GUI 并配置和生成 Makefile,然后选择打开 Visual Studio 的打开项目。当我构建并运行时,我得到了这个:

Hello, World!!
Hello world from processor MNE-REKR02.engr.psu.edu, rank 0 out of 1 processors

C:\Users\rhk12\code\cmake-visualstudio-msmpi\build\src\Debug\hellocmake.exe (process 18728) exited with code 0.
Press any key to close this window . . .

我不确定如何在 Visual Studio 中指定处理器数量。 CMake 配置找到 2,但这是一个不同的问题。

【讨论】:

猜你喜欢
  • 2018-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多