2017-09-25 12 views
2

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?

+0

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

Antwort

1

Die Nachricht besagt grundsätzlich, dass Sie den Pfad zu den Bibliotheken und die Namen der Bibliotheken angeben müssen. Das folgende Beispiel sollte Ihr Problem beheben (siehe auch find_package(OpenMP)). Beachten Sie, dass ich die Brüheinheit mit dem Befehl "brew install llvm" verwende. Die ersten vier Zeilen sind nur der Vollständigkeit halber.

set(CMAKE_C_COMPILER "/usr/local/Cellar/llvm/5.0.1/bin/clang") 
set(CMAKE_CXX_COMPILER "/usr/local/Cellar/llvm/5.0.1/bin/clang++") 
set(OPENMP_LIBRARIES "/usr/local/Cellar/llvm/5.0.1/lib") 
set(OPENMP_INCLUDES "/usr/local/Cellar/llvm/5.0.1/include") 

OPTION (USE_OpenMP "Use OpenMP to enamble <omp.h>" ON) 

# Find OpenMP 
if(APPLE AND USE_OpenMP) 
    if(CMAKE_C_COMPILER_ID MATCHES "Clang") 
     set(OpenMP_C "${CMAKE_C_COMPILER}") 
     set(OpenMP_C_FLAGS "-fopenmp=libomp -Wno-unused-command-line-argument") 
     set(OpenMP_C_LIB_NAMES "libomp" "libgomp" "libiomp5") 
     set(OpenMP_libomp_LIBRARY ${OpenMP_C_LIB_NAMES}) 
     set(OpenMP_libgomp_LIBRARY ${OpenMP_C_LIB_NAMES}) 
     set(OpenMP_libiomp5_LIBRARY ${OpenMP_C_LIB_NAMES}) 
    endif() 
    if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") 
     set(OpenMP_CXX "${CMAKE_CXX_COMPILER}") 
     set(OpenMP_CXX_FLAGS "-fopenmp=libomp -Wno-unused-command-line-argument") 
     set(OpenMP_CXX_LIB_NAMES "libomp" "libgomp" "libiomp5") 
     set(OpenMP_libomp_LIBRARY ${OpenMP_CXX_LIB_NAMES}) 
     set(OpenMP_libgomp_LIBRARY ${OpenMP_CXX_LIB_NAMES}) 
     set(OpenMP_libiomp5_LIBRARY ${OpenMP_CXX_LIB_NAMES}) 
    endif() 
endif() 

if(USE_OpenMP) 
    find_package(OpenMP REQUIRED) 
endif(USE_OpenMP) 

if (OPENMP_FOUND) 
    include_directories("${OPENMP_INCLUDES}") 
    link_directories("${OPENMP_LIBRARIES}") 
    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") 
    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") 
    # set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}") 
endif(OPENMP_FOUND) 

Sie möchten z. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lpthread") so, dass der Linker die entsprechende pthread-Bibliothek automatisch erkennt (siehe pthread und wiki).