我正在使用来自Homebrew的最新CMake(3.9.3),以及来自Brew的LLVM 5.0.0,因为这里的Clang支持OpenMP。
在CMake 3.8.2与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时提供了一个-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()
我知道这个Clang可以使用-fopenmp=libomp
,因此我将其用于我的项目。
这样做正确吗?