2016-03-18 4 views
3

Ich entwickle eine MPI-Anwendung, die mit einer bestimmten Implementierung von MPI (nennen wir es MPIvA) ausgeführt werden muss. Auf meiner Arbeitsstation ist eine andere Implementierung von MPI (nennen wir es MPIvB) installiert.CMake: Pfad zu MPI-Header und Binaries manuell setzen

Meine Anwendung ist mit CMake gebaut und die find_library(MPI) zeigt offensichtlich auf MPIvB. Es kompiliert und läuft ohne Probleme.

Ich kompilierte MPIvA auf meiner Arbeitsstation. Wie kann ich CMake diese Header und Binärdateien verwenden?

Antwort

3

CMake kommt mit einem FindMPI Modul, das für Sie alle schweres Heben tut.

In Ihrem CMakeLists.txt statt find_library(MPI) aufzurufen, verwenden Sie find_package wie so:

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

Dann, wo Sie Ihre Anwendung verknüpfen, Link gegen die ${MPI_LIBRARIES}:

target_link_libraries(example-app ${MPI_LIBRARIES}) 

Jetzt wird cmake automatisch Finden Sie eine MPI-Implementierung in Ihrem System. Wenn Sie mehrere verschiedene MPI-Versionen haben und angeben möchten, mit welcher zu kompilieren ist, können Sie die MPI_C_COMPILER und MPI_CXX_COMPILER Variablen auf die entsprechenden mpicc und mpicxx Compiler Wrapper setzen. Das CMake-Modul wird dann diese verwenden, um alle erforderlichen Compiler- und Linker-Flags selbst herauszufinden.

Beispiel:

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

Um sicherzustellen, dass Cmake die richtige MPI verwendet, in einem neuen leeren Build-Verzeichnis starten.

Mehr Informationen über die FindMPI Modul hier: https://cmake.org/cmake/help/v3.0/module/FindMPI.html

+0

Dies ist in der Tat eine sehr bequeme Art und Weise, es zu tun. CMake benötigt auch die 'MPI_C_INCLUDE_PATH' (Pfad zum Header-Verzeichnis) und' MPI_C_LIBRARIES' (Pfad zur .so-Bibliotheksdatei) (oder ihre C++ Gegenstücke), um auf die entsprechenden Werte gesetzt zu werden. – M4urice

+0

@ M4urice nicht unbedingt. Das FindMPI-Modul ermittelt diese Pfade direkt aus dem Compiler-Wrapper 'mpicc'. Wenn Sie auf den oben angegebenen Link klicken, werden diese beiden Möglichkeiten beschrieben. 1) Über den Pfad zum 'mpicc' Wrapper, oder 2) manuell über die Einstellung der Bibliothek und Linkpfade manuell. Version 1 sollte normalerweise funktionieren und ist einfacher, da es auch weitere benötigte Linker- und Compiler-Flags abzieht. – Patrick

+0

In der Tat war ich nicht spezifisch genug: Ich musste dies entsprechend mit Punkt 2 tun, weil Punkt 1 fehlgeschlagen ist. Die Implementierung von MPI, die ich kompiliert habe, ist nicht in einem Systempfad installiert, sie befindet sich irgendwo in meinem Home-Verzeichnis. – M4urice

1

Um mit MPIvA auf Ihrer Workstation zu kompilieren, benötigen Sie CMake, um zuerst diese Header und Binaries zu finden. Der folgende Link beschreibt, wie die Suchreihenfolge von CMake find_library funktioniert: https://cmake.org/cmake/help/v3.0/command/find_library.html

Ich würde vorschlagen, MPIvA zum CMAKE_LIBRARY_PATH hinzuzufügen. Sehen Sie sich die Top-Antwort auf die folgende Frage für ein Beispiel: How do I instruct CMake to look for libraries installed by MacPorts?