我使用Homebrew的最新CMake(3.9.3)以及Brew的LLVM 5.0.0,因爲這裏的Clang具有OpenMP支持。MacOS,CMake和OpenMP
這個工作在3.8.2的CMake與LLVM 5.
在我CMakeLists.txt
我有
find_package(OpenMP)
,後來我想這樣做
if(OpenMP_CXX_FOUND)
但是沒有按的CMake似乎沒有拿起find_package
指令。
我運行CMake的與
cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang -DUSE_WERROR=ON
,我已經檢查了正確clang
和clang++
點/usr/local/opt/llvm/bin/clang
和/usr/local/opt/llvm/bin/clang++
我得到的是這兩條線:
-- 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")
如果我我自己設置OpenMP_C_FLAGS
(使用-DOpenMP_C_FLAGS=-fopenmp=libomp
)它將錯誤更改爲
-- Could NOT find OpenMP_C (missing: OpenMP_C_LIB_NAMES) (found version "3.1")
注意,它改變了版本號,所以它一定是在找東西吧?
我錯過了什麼才能正常工作?
好吧,它似乎是由CMake的提供的FindOpenMP.cmake
裏面我們做了try_compile
,它就會失敗(因爲我們做了很多次,其中大部分會失敗,這是有道理的)。但是,隨着Clang a -Werror
標誌被提供,由於未使用的命令行參數而失敗。因此,我可以添加:
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()
到我的項目,因爲我知道,-fopenmp=libomp
將爲此鏘工作。
這是正確的做法嗎?
是的,LGTM。您可以使用[導入的目標](https://cmake.org/cmake/help/v3.9/module/FindOpenMP.html),讓您的生活變得更輕鬆。 – compor