Ich benutze die neueste CMake (3.9.3) von Homebrew zusammen mit LLVM 5.0.0 auch von Brew, weil Clang hier OpenMP-Unterstützung hat.MacOS, CMake und OpenMP
Das funktionierte in CMake 3.8.2 mit LLVM 5.
In meinem CMakeLists.txt
ich
find_package(OpenMP)
haben und später möchte ich
if(OpenMP_CXX_FOUND)
jedoch CMake doesn tun scheint nicht auf die find_package
Richtlinie aufzugreifen.
Ich betreibe CMake mit
cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang -DUSE_WERROR=ON
, wo ich überprüft haben, dass clang
und clang++
Punkte richtig zu /usr/local/opt/llvm/bin/clang
und /usr/local/opt/llvm/bin/clang++
Alles, was ich bekommen, ist diese beiden Linien:
-- Could NOT find OpenMP_C (missing: OpenMP_C_FLAGS OpenMP_C_LIB_NAMES) (found version "1.0")
-- Could NOT find OpenMP_CXX (missing: OpenMP_CXX_FLAGS OpenMP_CXX_LIB_NAMES) (found version "1.0")
Wenn ich setze OpenMP_C_FLAGS
mich selbst (mit -DOpenMP_C_FLAGS=-fopenmp=libomp
) es ändert den Fehler auf
-- Could NOT find OpenMP_C (missing: OpenMP_C_LIB_NAMES) (found version "3.1")
Beachten Sie, dass es die Versionsnummer ändert, so muss es etwas finden, richtig?
Was fehlt mir, damit das richtig funktioniert?
Okay, es scheint, dass das Innere FindOpenMP.cmake
von CMake lieferten wir eine try_compile
tun, die lautlos fehlschlägt (weil wir es eine Menge Zeit zu tun und die meisten von ihnen scheitern, dies Sinn macht). Mit Clang wird jedoch ein -Werror
Flag bereitgestellt, das aufgrund eines unbenutzten Befehlszeilenarguments fehlschlägt. Ich kann also hinzufügen:
if(APPLE)
if(CMAKE_C_COMPILER_ID STREQUAL "Clang")
set(OpenMP_C_FLAG "-fopenmp=libomp -Wno-unused-command-line-argument")
endif()
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
set(OpenMP_CXX_FLAG "-fopenmp=libomp -Wno-unused-command-line-argument")
endif()
endif()
mein Projekt, weil ich weiß, dass -fopenmp=libomp
für diesen Clang arbeiten.
Ist das der richtige Weg?
Ja, LGTM. Du könntest von nun an die [importierten Ziele] (https://cmake.org/cmake/help/v3.9/module/FindOpenMP.html) verwenden, um dein Leben ein bisschen einfacher zu machen. – compor