Использовать MPI в CMake в Microsoft Visual Studio - PullRequest
2 голосов
/ 26 июня 2019

У меня есть проект C++, который реализован в Linux с JetBrain CLion IDE.Чтобы получить исполняемый файл, я использовал CMake, который полностью совпадает с JetBrain CLion.Проект использует MPI для обработки многоузловой обработки, и проект отлично работает в Linux.

Теперь мне нужно также получить исполняемый файл для Windows.Итак, я установил версию сообщества Visual Studio 2019 вместе с Microsft MPI, чтобы построить там свой проект.Я обнаружил, что проще создать файл sln для проекта с помощью CMake, а затем импортировать проект в VS.Но, когда я попробовал этот подход, я получил ошибку за то, что не нашел MPI:

Could NOT find MPI_C (missing: MPI_C_LIB_NAMES MPI_C_HEADER_DIR MPI_C_WORKS) 
Could NOT find MPI_CXX (missing: MPI_CXX_LIB_NAMES MPI_CXX_HEADER_DIR MPI_CXX_WORKS) 
CMake Error at C:/Program Files/CMake/share/cmake-3.15/Modules/FindPackageHandleStandardArgs.cmake:137 (message):
  Could NOT find MPI (missing: MPI_C_FOUND MPI_CXX_FOUND)
Call Stack (most recent call first):
  C:/Program Files/CMake/share/cmake-3.15/Modules/FindPackageHandleStandardArgs.cmake:378 (_FPHSA_FAILURE_MESSAGE)
  C:/Program Files/CMake/share/cmake-3.15/Modules/FindMPI.cmake:1687 (find_package_handle_standard_args)
  CMakeLists.txt:35 (find_package)

Код cmake, который работает в Linux:

find_package(MPI REQUIRED)
include_directories(${MPI_INCLUDE_PATH})
add_executable(prjt main.cpp)
add_subdirectory(sub1)
add_subdirectory(sub2)
target_link_libraries(prjt ${MPI_LIBRARIES})
set_property(TARGET prjt PROPERTY CXX_STANDARD 11)

После прочтения [1] и [2] , я также пытался:

set(CMAKE_PREFIX_PATH "C:/Program Files/Microsoft 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}")
add_executable(prjt main.cpp)
add_subdirectory(sub1)
add_subdirectory(sub2)
target_link_libraries(prjt ${MPI_LIBRARIES})
set_property(TARGET prjt PROPERTY CXX_STANDARD 11)

, но все равно безуспешно.

Я также пытался связать MPI напрямую через MSVS, как указано в [3] , но это тоже не сработало.Проблема в этом подходе заключается в том, что когда я вызываю set MSMPI, я получаю только MSMPI_BIN=C:\Program Files\Microsoft MPI\Bin\, а остальные переменные среды не получаю.В Linker из MSVS я также вручную добавил адрес Microst SDK.(Я также добавил другие обязательные переменные среды, как [4] объясняет)

Я ценю любую помощь или комментарий.

...