2016-06-22 26 views
6

Mam problem z użyciem cmake do zbudowania prostego kodu OpenMP.clang, openMP i CMake

mam zainstalowane clang-OMP i mogę skompilować program ze clang-omp -fopenmp filename.c

Próbowałem dużo aby plik CMakeLists.txt, bez rezultatów! W pliku podaję:

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

Próbowałem zarówno powiedzieć CMake używać tego kompilatora powołując

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

i bez.

Wynik w obu przypadkach jest następujący

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

Czy jesteś pewien, że CMake pobiera kompilator ze zmiennych środowiskowych? Według [FAQ] (https://cmake.org/Wiki/CMake_FAQ#How_do_I_use_a_different_compiler.3F) takie ustawienie kompilatora nie zawsze działa. – Tsyvarev

+0

Co powiesz na 'cmake -DCMAKE_CXX_COMPILER = clang-omp ++ -DCMAKE_C_COMPILE = clang-omp'? – arrowd

+0

Jak masz zainstalowany clang i jaką wersję? W najnowszej wersji wsparcie dla OpenMP jest bardziej usprawnione niż w poprzednim i nie martw się o wiele mniej. Mówiąc w ten sposób, musisz mieć zainstalowaną bibliotekę uruchomieniową openmp, w przeciwieństwie do GCC. Sprawdź swojego menedżera pakietów. – youngmit

Odpowiedz

0

Problem z dodawaniem brzękiem niesystemowym (dla mnie, LLVM 4.0) jest to, że trzeba dodać include i lib. llvm-config poprawnie podnosi je w moim przypadku, ale CMake ich nie używa.

Zakładając, że PATH jest w porządku, i masz ustawione CC i CXX już, trzeba dodać:

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

Jeśli wolisz Lmod ten plik .lua powinno wystarczyć:

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

(To na Maca, zmień DYLD na LD dla Linuksa)

To działa dobrze z CMake, odbiera -fopenmp. Kompilowanie ręczne wymaga również tylko jednej flagi.