【发布时间】:2018-03-06 23:32:54
【问题描述】:
我正在使用来自 Homebrew 的最新 CMake (3.9.3) 以及来自 Brew 的 LLVM 5.0.0,因为这里的 Clang 支持 OpenMP。
这适用于带有 LLVM 5 的 CMake 3.8.2。
在我的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 提供了一个 -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 将适用于这个 Clang。
这是正确的做法吗?
【问题讨论】:
-
是的,LGTM。从那时起,您可以使用imported targets 让您的生活更轻松。