2017-12-17 7 views
0

私は強制する必要がありますCmake私のMPIコードを構築し、MPICHとリンクする必要があります。私のMPICHはUbuntuパッケージマネージャを使って、標準の場所/usr/lib/mpich/にインストールされています。しかし、CMakeはまだ私が使用していないOpenMPIライブラリを探しています。 CMakeに代わりにMPICHを探すように指示する方法はありますか?以下はCMakeでMPakeをビルド

、あなたはいくつかの基本的な診断の出力を確認できます。以下は

$ 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で動作します。

/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 

そして私は、私は次の取得バイナリを実行します:私は次の出力を得るCMakeの状態からの

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} 
    ) 

[email protected]:~$ 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

[MPIエラー共有ライブラリの読み込み]の可能な複製(https://stackoverflow.com/questions/14769599/mpi-error-loading-shared-libraries) – Tsyvarev

+0

@Tsyvarevこれを調べていただきありがとうございます。以前の投稿は、標準以外のライブラリのインストールに対処するためには役に立たないでしょう:_ "libmpiとlibmpi_cxxはOpen MPIインストールの一部であり、あなたのケースでは明示的にインクルードされなければならない**非標準**の場所にありますリンカー検索パスLD_LIBRARY_PATH "_。私がCMakeを使うとき、私は標準インストールでENV変数を設定する必要はありませんでした。私は、それがmpichをサポートしていることを考えると、** CMake **がそれを処理できると期待しています。私は_probably_ソリューションは、CMakeスクリプト自体を介して来ると期待しています。 – user1221647

+0

[FindMPI](https://cmake.org/cmake/help/v3.0/module/FindMPI.html)ページにある情報に基づいて少し試してみます。 ** MPI_C_LIBRARIES **と** MPI_INCLUDE_PATH **は推奨されていないようです。おそらく、より良いリンク方法があります。 – user1221647

答えて

0

How can I instruct CMake to look for MPICH instead?

FindMPI documentationによると、あなたは所望のMPIコンパイラに対してMPI_<lang>_COMPILER変数を設定することができます:

Set MPI_<lang>_COMPILER to the MPI wrapper (mpicc, etc.) of your choice and reconfigure. FindMPI will attempt to determine all the necessary variables using THAT compiler's compile and link flags.

set(MPI_CXX_COMPILER <path-to-mpich-compiler>) 
find_package(MPI REQUIRED) 

また、CMake version 3.10いるので、変数MPI_EXECUTABLE_SUFFIXが代わりに設定することができます。私の現在のソリューションこれにより

A suffix which is appended to all names that are being looked for. For instance you may set this to .mpich or .openmpi to prefer the one or the other on Debian and its derivatives.

set(MPI_EXECUTABLE_SUFFIX ".mpich") 
find_package(MPI REQUIRED) 
+0

残念ながら、これは私の問題を解決しませんでした。 [[22951,1]、0]:高性能Open MPIポイントツーポイントメッセージング モジュールが関連するネットワークインターフェイスを見つけることができませんでした:モジュール:OpenFabrics(openib ) 私の答えは以下の通りです。 – user1221647

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で構築されていました。私がよりよい選択肢を見つけたら、私は再投稿します。

関連する問題