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
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
@ 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
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