【发布时间】: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 Ask和minimal reproducible example。发布文本,而不是文本图像的链接。
-
您需要让
cmake使用 MPI 包装器(例如mpicc和朋友)而不是编译器(例如cc和朋友) -
您向我们展示了带有
find_package(MPI)调用的代码,但没有展示使用此调用结果的代码(包括目录、库等)。正是这部分负责是否会找到 MPI 标头。 -
@GillesGouaillardet 我一直在目录和网上四处寻找,似乎在使用 MS MPI 时,使用 cl 进行编译。 mpicc 甚至可以用 MS MPI 编译吗?
标签: c++ visual-studio cmake compiler-errors mpi