我需要强制 Cmake 使用 MPICH 构建和链接我的MPI代码。我的MPICH是使用Ubuntu软件包管理器在标准位置/usr/lib/mpich/
安装的。但是,CMake仍然会查找我不使用的 OpenMPI 库。 如何指示CMake寻找MPICH?
下面,您可以看到一些基本诊断的输出:
$ whereis openmpi
openmpi:
$ whereis mpich
mpich: /usr/lib/mpich /usr/include/mpich
$ mpicc -v
mpicc for MPICH version 3.2
下面,我还提供了Cmake脚本以及我从cmake和 mpirun.mpich 获得的错误。我的Cmake是3.5.1,我在Ubuntu Xenial 16.04上运行。
cmake_minimum_required(VERSION 3.0)
message (STATUS "Adding mpiService")
find_package(MPI REQUIRED)
set(CMAKE_C_COMPILER mpicc)
set(CMAKE_CXX_COMPILER mpicxx)
set(MPI_GUESS_LIBRARY_NAME MPICH2)
message(STATUS ${MPI_INCLUDE_PATH})
message(STATUS ${MPI_C_LIBRARIES})
#add_definitions(-DOMPI_SKIP_MPICXX)
add_executable(mpiService main.cpp)
set(CMAKE_VERBOSE_MAKEFILE ON)
include_directories(SYSTEM ${MPI_INCLUDE_PATH})
target_link_libraries(
mpiService
PRIVATE
${MPI_C_LIBRARIES}
)
从Cmake STATUS我得到以下输出:
/usr/lib/openmpi/include/openmpi/opal/mca/event/libevent2021/libevent/usr/lib/openmpi/include/openmpi/opal/mca/event/libevent2021/libevent/include/usr/lib/openmpi/include/usr/lib/openmpi/include/openmpi
/usr/lib/openmpi/lib/libmpi.so
当我运行二进制文件时,我得到以下内容:
ubuntu@node1:~$ mpirun.mpich -np 2 --host node1,node2 mpiService
mpiService: error while loading shared libraries: libmpi.so.12: cannot open shared object file: No such file or directory
mpiService: error while loading shared libraries: libmpi.so.12: cannot open shared object file: No such file or directory
答案 0 :(得分:1)
我如何指示CMake寻找MPICH?
根据FindMPI documentation,您可以将MPI_<lang>_COMPILER
变量设置为所需的MPI编译器:
将MPI_&lt; lang&gt; _COMPILER设置为您的MPI包装器(mpicc等) 选择和重新配置。 FindMPI将尝试确定所有 使用THAT编译器的编译和链接标志的必要变量。
set(MPI_CXX_COMPILER <path-to-mpich-compiler>)
find_package(MPI REQUIRED)
或者,由于CMake version 3.10,因此可以设置变量MPI_EXECUTABLE_SUFFIX
:
附加到所有正在查找的名称的后缀。例如,您可以将此设置为.mpich或.openmpi以优先选择Debian及其衍生产品中的一个。
set(MPI_EXECUTABLE_SUFFIX ".mpich")
find_package(MPI REQUIRED)
答案 1 :(得分:0)
这是我目前的解决方案。
find_package(MPI REQUIRED)
# ----------------
# This is the only thing that made it work
# ----------------
set(MPI_C_LIBRARIES "/usr/lib/mpich/lib/libmpich.so")
set(MPI_INCLUDE_PATH "/usr/include/mpich")
# ----------------
add_executable(mpiService main.cpp)
include_directories(SYSTEM ${MPI_INCLUDE_PATH})
target_link_libraries(
mpiService
${MPI_C_LIBRARIES}
)
我个人不喜欢这个解决方案,因为我必须明确指定路径。任何其他提议的解决方案仍然使用OpenMPI构建。如果我找到更好的选择,我会重新发布。