2016-06-22 12 views
6

Ich habe ein Problem mit cmake, um einen einfachen openMP-Code zu erstellen.clang, openMP und CMake

Ich habe Klirren-omp installiert und ich kann das Programm kompilieren mit clang-omp -fopenmp filename.c

ich viel versucht haben, eine CMakeLists.txt Datei zu machen, ohne Ergebnisse! In der Datei habe ich eingeschlossen:

FIND_PACKAGE(OpenMP REQUIRED) 
if(OPENMP_FOUND) 
message("OPENMP FOUND") 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") 
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}") 
endif() 

ich beide versucht CMake zu sagen, dass die Compiler zu verwenden, indem

CC=clang-omp CXX=clang-omp++ cmake 

und ohne Berufung.

Das Ergebnis ist in beiden Fällen ist wie bei Zugabe eines Nicht-System Klirren

-- Try OpenMP C flag = [-fopenmp=libomp] 
-- Performing Test OpenMP_FLAG_DETECTED 
-- Performing Test OpenMP_FLAG_DETECTED - Failed 
-- Try OpenMP C flag = [ ] 
-- Performing Test OpenMP_FLAG_DETECTED 
-- Performing Test OpenMP_FLAG_DETECTED - Failed 
-- Try OpenMP C flag = [-fopenmp] 
-- Performing Test OpenMP_FLAG_DETECTED 
-- Performing Test OpenMP_FLAG_DETECTED - Failed 
-- Try OpenMP C flag = [/openmp] 
-- Performing Test OpenMP_FLAG_DETECTED 
-- Performing Test OpenMP_FLAG_DETECTED - Failed 
-- Try OpenMP C flag = [-Qopenmp] 
-- Performing Test OpenMP_FLAG_DETECTED 
-- Performing Test OpenMP_FLAG_DETECTED - Failed 
-- Try OpenMP C flag = [-openmp] 
-- Performing Test OpenMP_FLAG_DETECTED 
-- Performing Test OpenMP_FLAG_DETECTED - Failed 
-- Try OpenMP C flag = [-xopenmp] 
-- Performing Test OpenMP_FLAG_DETECTED 
-- Performing Test OpenMP_FLAG_DETECTED - Failed 
-- Try OpenMP C flag = [+Oopenmp] 
-- Performing Test OpenMP_FLAG_DETECTED 
-- Performing Test OpenMP_FLAG_DETECTED - Failed 
-- Try OpenMP C flag = [-qsmp] 
-- Performing Test OpenMP_FLAG_DETECTED 
-- Performing Test OpenMP_FLAG_DETECTED - Failed 
-- Try OpenMP C flag = [-mp] 
-- Performing Test OpenMP_FLAG_DETECTED 
-- Performing Test OpenMP_FLAG_DETECTED - Failed 
-- Try OpenMP CXX flag = [-fopenmp=libomp] 
-- Performing Test OpenMP_FLAG_DETECTED 
-- Performing Test OpenMP_FLAG_DETECTED - Failed 
-- Try OpenMP CXX flag = [ ] 
-- Performing Test OpenMP_FLAG_DETECTED 
-- Performing Test OpenMP_FLAG_DETECTED - Failed 
-- Try OpenMP CXX flag = [-fopenmp] 
-- Performing Test OpenMP_FLAG_DETECTED 
-- Performing Test OpenMP_FLAG_DETECTED - Failed 
-- Try OpenMP CXX flag = [/openmp] 
-- Performing Test OpenMP_FLAG_DETECTED 
-- Performing Test OpenMP_FLAG_DETECTED - Failed 
-- Try OpenMP CXX flag = [-Qopenmp] 
-- Performing Test OpenMP_FLAG_DETECTED 
-- Performing Test OpenMP_FLAG_DETECTED - Failed 
-- Try OpenMP CXX flag = [-openmp] 
-- Performing Test OpenMP_FLAG_DETECTED 
-- Performing Test OpenMP_FLAG_DETECTED - Failed 
-- Try OpenMP CXX flag = [-xopenmp] 
-- Performing Test OpenMP_FLAG_DETECTED 
-- Performing Test OpenMP_FLAG_DETECTED - Failed 
-- Try OpenMP CXX flag = [+Oopenmp] 
-- Performing Test OpenMP_FLAG_DETECTED 
-- Performing Test OpenMP_FLAG_DETECTED - Failed 
-- Try OpenMP CXX flag = [-qsmp] 
-- Performing Test OpenMP_FLAG_DETECTED 
-- Performing Test OpenMP_FLAG_DETECTED - Failed 
-- Try OpenMP CXX flag = [-mp] 
-- Performing Test OpenMP_FLAG_DETECTED 
-- Performing Test OpenMP_FLAG_DETECTED - Failed 
CMake Error at /Applications/CMake.app/Contents/share/cmake-3.5/Modules/FindPackageHandleStandardArgs.cmake:148 (message): 
    Could NOT find OpenMP (missing: OpenMP_C_FLAGS OpenMP_CXX_FLAGS) 
Call Stack (most recent call first): 
    /Applications/CMake.app/Contents/share/cmake-3.5/Modules/FindPackageHandleStandardArgs.cmake:388 (_FPHSA_FAILURE_MESSAGE) 
    /Applications/CMake.app/Contents/share/cmake-3.5/Modules/FindOpenMP.cmake:234 (find_package_handle_standard_args) 
    CMakeLists.txt:4 (FIND_PACKAGE) 
+0

Sind Sie sicher, dass CMake Compiler von Umgebungsvariablen nehmen? Laut [FAQ] (https://cmake.org/Wiki/CMake_FAQ#How_do_I_use_a_different_compiler.3F) funktioniert eine solche Compilereinstellung nicht immer. – Tsyvarev

+0

Wie wäre es mit 'cmake -DCMAKE_CXX_COMPILER = clang-omp ++ -DCMAKE_C_COMPILE = clang-omp? – arrowd

+0

Wie hast du clang installiert, und welche Version? In letzter Zeit ist die Unterstützung von openmp schlanker als zuvor, und es gibt viel weniger Sorgen. Abgesehen davon muss die Openmp-Laufzeitbibliothek installiert sein, anders als bei GCC. Überprüfen Sie Ihren Paketmanager. – youngmit

Antwort

0

Das Problem folgt (für mich, LLVM 4.0) ist, dass Sie die include und lib Verzeichnisse hinzufügen müssen. llvm-config nimmt sie in meinem Fall richtig auf, aber CMake benutzt sie nicht.

Angenommen, Ihre PATH in Ordnung ist, und Sie haben CC und CXX bereits gesetzt ist, müssen Sie hinzufügen:

export C_INCLUDE_PATH=$(llvm-config --includedir) 
export CPLUS_INCLUDE_PATH=$(llvm-config --includedir) 
export LIBRARY_PATH=$(llvm-config --libdir) 

Wenn Sie Lmod bevorzugen, diese .lua Datei sollte es tun:

help([[ 
This is the module file for the llvm and clang compiler. 
]]) 

local version = "4.0" 

whatis("Name: LLVM") 
whatis("Version: " .. version) 
whatis("Keywords: System, Compiler") 
whatis("URL: http://www.llvm.org/") 
whatis("Description: LLVM compiler family") 

family("compiler") 

local prefix = "/work/llvm" 

prepend_path("PATH", pathJoin(prefix, "bin")) 
setenv("CC", pathJoin(prefix, "bin/clang")) 
setenv("CXX", pathJoin(prefix, "bin/clang++")) 
setenv("C_INCLUDE_PATH", pathJoin(prefix, "include")) 
setenv("CPLUS_INCLUDE_PATH", pathJoin(prefix, "include")) 
setenv("LIBRARY_PATH", pathJoin(prefix, "lib")) 
prepend_path("DYLD_LIBRARY_PATH", pathJoin(prefix, "lib")) 

(Das ist für Mac, ändern DYLD zu LD für Linux)

Dies funktioniert gut mit CMake, nimmt es -fopenmp. Das Kompilieren per Hand erfordert nur eine Flagge.