2016-06-22 50 views
6

Ho un problema nell'utilizzo di cmake per creare un semplice codice openMP.clang, openMP e CMake

Ho installato clang-OMP e posso compilare il programma con clang-omp -fopenmp filename.c

Ho provato un sacco di fare un file CMakeLists.txt, senza risultati! Nel file ho incluso:

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

Ho provato entrambi a dire CMake di usare quel compilatore invocando

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

e senza.

Il risultato in entrambi i casi è la seguente

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

Sei sicuro che CMake prenda il compilatore dalle variabili di ambiente? Secondo [FAQ] (https://cmake.org/Wiki/CMake_FAQ#How_do_I_use_a_different_compiler.3F), tale impostazione del compilatore non sempre funziona. – Tsyvarev

+0

Che ne dici di 'cmake -DCMAKE_CXX_COMPILER = clang-omp ++ -DCMAKE_C_COMPILE = clang-omp'? – arrowd

+0

Come hai installato clang e quale versione? Nel più recente supporto per openmp è più snello rispetto al passato e c'è molto meno da preoccuparsi. Detto questo, è necessario che la libreria di runtime di openmp sia installata, diversamente da GCC. Controlla il tuo gestore di pacchetti. – youngmit

risposta

0

Il problema con l'aggiunta di un clangore non di sistema (per me, LLVM 4,0) è che si devono aggiungere le directory di include e lib. llvm-config li preleva correttamente nel mio caso, ma CMake non li sta utilizzando.

Assumendo che il PATH va bene, e hai impostato CC e CXX già, è necessario aggiungere:

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

Se si preferisce Lmod, questo file .lua dovrebbe farlo:

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

(Questo è per Mac, modificare DYLD a LD per Linux)

Funziona perfettamente con CMake, raccoglie -fopenmp. La compilazione a mano richiede solo una bandiera, pure.