首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用CMake构建MPICH

用CMake构建MPICH
EN

Stack Overflow用户
提问于 2017-12-17 23:32:47
回答 2查看 1.3K关注 0票数 1

我需要强制我的Cmake构建并将我的MPI代码与MPICH连接起来。我的MPICH是使用Ubuntu安装在标准位置/usr/lib/mpich/中的。但是,CMake仍然查找OpenMPI库,我不使用这些库。如何指示CMake去寻找MPICH呢?

下面,您可以看到一些基本诊断的输出:

代码语言:javascript
复制
$ 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,我在16.04上运行。

代码语言:javascript
复制
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状态中,我得到了以下输出:

代码语言:javascript
复制
/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

当我运行二进制文件时,我得到以下信息:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2017-12-26 09:36:06

我怎样才能指示CMake去寻找MPICH呢?

根据FindMPI文档,您可以将MPI_<lang>_COMPILER变量设置为所需的MPI编译器:

将MPI__COMPILER设置为MPI包装器(mpicc等)你的选择和重新配置。FindMPI将尝试使用编译器的编译和链接标志来确定所有必需的变量。

代码语言:javascript
复制
set(MPI_CXX_COMPILER <path-to-mpich-compiler>)
find_package(MPI REQUIRED)

或者,由于CMake 3.10版,可以设置变量MPI_EXECUTABLE_SUFFIX

一个后缀,它被附加到正在查找的所有名称之后。例如,您可以将其设置为.mpich或.openmpi,以选择Debian及其衍生工具中的一个或另一个。

代码语言:javascript
复制
set(MPI_EXECUTABLE_SUFFIX ".mpich")
find_package(MPI REQUIRED)
票数 2
EN

Stack Overflow用户

发布于 2018-01-29 23:34:23

随函附上我目前的解决方案。

代码语言:javascript
复制
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构建。如果我找到更好的选择,我会重新发布。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47860487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档