2016-03-18 23 views
3

MPIの特定の実装で実行する必要があるMPIアプリケーションを開発しています(MPIvAと呼んでください)。私のワークステーションには、MPI(MPIvBと呼ぶ)の別の実装がインストールされています。CMake:MPIヘッダーとバイナリへのパスを手動で設定する

私のアプリケーションはCMakeを使用して構築され、find_library(MPI)は明らかにMPIvBを指しています。それはコンパイルされ、面倒なく実行されます。

私のワークステーションでMPIvAをコンパイルしました。 CMakeがこれらのヘッダーとバイナリを使用するにはどうしたらいいですか?

答えて

3

CMakeはあなたのためにすべての重荷を取ります。あなたのCMakeLists.txtで

、代わりにfind_library(MPI)を呼び出し、そのようfind_packageを使用します。

#### MPI 
find_package(MPI REQUIRED) 
if (MPI_FOUND) 
    include_directories(SYSTEM ${MPI_INCLUDE_PATH}) 
else (MPI_FOUND) 
    message(SEND_ERROR "This application cannot compile without MPI") 
endif (MPI_FOUND) 

次に、あなたがあなたのアプリケーション、${MPI_LIBRARIES}に対するリンクをリンクどこ:

target_link_libraries(example-app ${MPI_LIBRARIES}) 

今cmakeのは、自動的になりますあなたのシステムに MPI実装が見つかりました。複数の異なるMPIバージョンを使用していて、どちらをコンパイルするかを指定する場合は、対応するmpiccおよびmpicxxコンパイララッパーにMPI_C_COMPILERおよびMPI_CXX_COMPILER変数を設定できます。 CMakeモジュールはそれらを使用して、必要なコンパイラとリンカのすべてのフラグを調べます。

例:

cmake -DMPI_C_COMPILER=/usr/share/mvapich/bin/mpicc your-project-dir 

cmakeのが正しいMPIを使用していることを確認するには、新しい空のビルドディレクトリで開始します。ここFindMPIモジュール上の

詳細情報:https://cmake.org/cmake/help/v3.0/module/FindMPI.html

+0

これは実際にそれを行うには非常に便利な方法です。 CMakeは 'MPI_C_INCLUDE_PATH'(ヘッダディレクトリへのパス)と' MPI_C_LIBRARIES'(.soライブラリファイルへのパス)(あるいはそのC++の対応物)を適切な値に設定する必要もあります。 – M4urice

+0

@ M4uriceは必ずしも必要ではありません。 FindMPIモジュールは、コンパイララッパー 'mpicc'から直接それらのパスを取り出します。上記のリンクをクリックすると、これらの2つの可能性が説明されています。 1)パスを 'mpicc'ラッパーに渡すか、または2)手動でライブラリとリンクパスを手動で設定します。バージョン1は通常動作し、より簡単です。これはさらに、必要なリンカーとコンパイラフラグを減算するためです。 – Patrick

+0

確かに、私は十分に具体的ではありませんでした。ポイント1が失敗したのでポイント2でこれを行う必要がありました。私がコンパイルしたMPIの実装は、システムパスにインストールされていないので、私のホームディレクトリのどこかに座っています。 – M4urice

1

あなたのワークステーションでMPIvAをコンパイルするには、まずそれらのヘッダとバイナリを見つけるためにCMakeが必要です。次のリンクは、CMakeのfind_libraryの検索順序がどのように動作するかを説明しています。https://cmake.org/cmake/help/v3.0/command/find_library.html

CIMKE_LIBRARY_PATHにMPIvAを追加することをお勧めします。例については、次の質問の上の答えを参照してください: How do I instruct CMake to look for libraries installed by MacPorts?

関連する問題