clang、OpenMP 和 CMake

9

我在使用cmake构建简单的openMP代码时遇到了问题。

我已经安装了clang-omp,并可以使用clang-omp -fopenmp filename.c编译程序。

我尝试了很多次制作CMakeLists.txt文件,但没有成功!在文件中,我已经包含了:

FIND_PACKAGE( OpenMP REQUIRED)
if(OPENMP_FOUND)
message("OPENMP FOUND")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
endif()

我尝试使用以下命令告诉CMake使用该编译器:

CC=clang-omp CXX=clang-omp++ cmake 

没有。

两种情况的结果如下:

-- Try OpenMP C flag = [-fopenmp=libomp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP C flag = [ ]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP C flag = [-fopenmp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP C flag = [/openmp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP C flag = [-Qopenmp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP C flag = [-openmp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP C flag = [-xopenmp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP C flag = [+Oopenmp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP C flag = [-qsmp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP C flag = [-mp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP CXX flag = [-fopenmp=libomp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP CXX flag = [ ]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP CXX flag = [-fopenmp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP CXX flag = [/openmp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP CXX flag = [-Qopenmp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP CXX flag = [-openmp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP CXX flag = [-xopenmp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP CXX flag = [+Oopenmp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP CXX flag = [-qsmp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP CXX flag = [-mp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
CMake Error at /Applications/CMake.app/Contents/share/cmake-3.5/Modules/FindPackageHandleStandardArgs.cmake:148 (message):
  Could NOT find OpenMP (missing: OpenMP_C_FLAGS OpenMP_CXX_FLAGS)
Call Stack (most recent call first):
  /Applications/CMake.app/Contents/share/cmake-3.5/Modules/FindPackageHandleStandardArgs.cmake:388 (_FPHSA_FAILURE_MESSAGE)
  /Applications/CMake.app/Contents/share/cmake-3.5/Modules/FindOpenMP.cmake:234 (find_package_handle_standard_args)
  CMakeLists.txt:4 (FIND_PACKAGE)

你确定CMake会从环境变量中获取编译器吗?根据FAQ,这样的编译器设置并不总是有效。 - Tsyvarev
cmake -DCMAKE_CXX_COMPILER=clang-omp++ -DCMAKE_C_COMPILE=clang-omp 这个怎么样? - arrowd
2
很抱歉,@Jim Cownie,使用clang 3.8并不能“轻松搞定”。我得到了与提问者完全相同的错误信息。运行时安装在哪里? - Teodor Nikolov
使用clang 4.0和cmake 3.6.2对我也不起作用。 - David Doria
文档中说这个应该是“可以直接使用”的:http://openmp.llvm.org/ ,但它并没有说明如何通过CMake来使用。 - David Doria
显示剩余2条评论
1个回答

0
使用非系统的clang(对我来说是LLVM 4.0)的问题在于您必须添加包含和库目录。在我的情况下,llvm-config 正确地拾取它们,但CMake没有使用它们。
假设您的 PATH 没问题,并且已经设置了 CCCXX,您需要添加:
export C_INCLUDE_PATH=$(llvm-config --includedir)
export CPLUS_INCLUDE_PATH=$(llvm-config --includedir)
export LIBRARY_PATH=$(llvm-config --libdir)

如果您喜欢使用Lmod,那么这个.lua文件应该可以胜任:
help([[
This is the module file for the llvm and clang compiler.
]])

local version = "4.0"

whatis("Name: LLVM")
whatis("Version: " .. version)
whatis("Keywords: System, Compiler")
whatis("URL: http://www.llvm.org/")
whatis("Description: LLVM compiler family")

family("compiler")

local prefix = "/work/llvm"

prepend_path("PATH", pathJoin(prefix, "bin"))
setenv("CC",  pathJoin(prefix, "bin/clang"))
setenv("CXX", pathJoin(prefix, "bin/clang++"))
setenv("C_INCLUDE_PATH", pathJoin(prefix, "include"))
setenv("CPLUS_INCLUDE_PATH", pathJoin(prefix, "include"))
setenv("LIBRARY_PATH", pathJoin(prefix, "lib"))
prepend_path("DYLD_LIBRARY_PATH", pathJoin(prefix, "lib"))

(这是针对Mac的,对于Linux,请将DYLD更改为LD

使用CMake可以很好地完成此工作,它会选择-fopenmp。手动编译只需要一个标志。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接