2017-09-25 4 views
2

J'utilise le plus récent CMake (3.9.3) de Homebrew avec LLVM 5.0.0 également de Brew, parce que Clang supporte OpenMP.MacOS, CMake et OpenMP

Cela a fonctionné dans CMake 3.8.2 avec LLVM 5.


Dans mon CMakeLists.txt je

find_package(OpenMP) 

et plus tard je veux faire

if(OpenMP_CXX_FOUND) 

Cependant CMake doesn ne semblent pas relever de la directive find_package.

Je cours CMake avec

cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang -DUSE_WERROR=ON 

où j'ai vérifié que clang et clang++ des points correctement /usr/local/opt/llvm/bin/clang et /usr/local/opt/llvm/bin/clang++

Tout ce que je reçois est ces deux lignes:

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

Si je définir OpenMP_C_FLAGS moi-même (avec -DOpenMP_C_FLAGS=-fopenmp=libomp) il change l'erreur à 012 Notez que cela change le numéro de version, il doit donc être trouvé quelque chose, non? Que dois-je faire pour que cela fonctionne correctement?


Bon, il semble qu'à l'intérieur du FindOpenMP.cmake fourni par CMake nous faisons try_compile, qui échoue silencieusement (parce que nous faisons beaucoup de fois et la plupart d'entre eux échouent, cela a un sens). Cependant, avec Clang, un drapeau -Werror est fourni, qui échoue en raison d'un argument de ligne de commande inutilisé. Je peux donc ajouter:

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

à mon projet parce que je sais que -fopenmp=libomp fonctionnera pour cette Clang.

Est-ce la bonne façon de le faire?

+0

Oui, LGTM. Vous pouvez désormais utiliser les [cibles importées] (https://cmake.org/cmake/help/v3.9/module/FindOpenMP.html) pour vous faciliter la vie. – compor

Répondre

1

Le message vous indique essentiellement que vous devez fournir le chemin d'accès aux bibliothèques et les noms des bibliothèques. L'exemple suivant devrait résoudre votre problème (voir aussi find_package(OpenMP)). Notez que j'utilise l'installation d'infusion en utilisant la commande "brew install llvm". Les quatre premières lignes sont juste pour l'exhaustivité.

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) 

Vous pouvez définir par ex. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lpthread") de sorte que l'éditeur de liens détecte automatiquement la bibliothèque pthread appropriée (voir pthread et wiki).