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