9

I have a problem using cmake to build a simple openMP code.

I've installed clang-omp and I can compile the program with clang-omp -fopenmp filename.c

I've tried a lot to make a CMakeLists.txt file, without results! In the file I've included:

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()

I tried both to tell CMake to use that compiler by invoking:

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

and without.

The result in both case is as follows:

-- 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)
Kevin
  • 16,549
  • 8
  • 60
  • 74
T. L.
  • 141
  • 1
  • 4
  • Are you sure that CMake take compiler from environment variables? According to [FAQ](https://cmake.org/Wiki/CMake_FAQ#How_do_I_use_a_different_compiler.3F), such compiler setting doesn't always work. – Tsyvarev Jun 22 '16 at 16:55
  • How about `cmake -DCMAKE_CXX_COMPILER=clang-omp++ -DCMAKE_C_COMPILE=clang-omp`? – arrowd Jun 22 '16 at 18:30
  • How do you have clang installed, and what version? In the most recent, openmp support is more streamlined than in previous and there is a lot less to worry about. That being said, you need to have the openmp runtime library installed, unlike with GCC. Check your package manager. – youngmit Jun 22 '16 at 21:50
  • As yougmit says, Clang 3.8 on Linux includes OpenMP support in the compiler, so there's no need to use a special version. It also includes the OpenMP runtime, so everything should "just work" – Jim Cownie Jun 24 '16 at 14:03
  • 2
    @Jim Cownie, unfortunately, with clang 3.8 it doesn't "just work". I get exactly the same error message as the person asking the question. Where is the runtime installed? – Teodor Nikolov Aug 05 '16 at 19:27
  • It also doesn't work for me with clang 4.0 and cmake 3.6.2 – David Doria Nov 21 '16 at 21:46
  • The documentation says it is supposed to "just work": http://openmp.llvm.org/ but it doesn't say anything about how to use it via CMake. – David Doria Nov 22 '16 at 01:51

1 Answers1

0

The problem with adding a non-system clang (for me, LLVM 4.0) is that you have to add the include and lib directories. llvm-config correctly picks them up in my case, but CMake is not using them.

Assuming your PATH is okay, and you've set CC and CXX already, you need to add:

export C_INCLUDE_PATH=$(llvm-config --includedir)
export CPLUS_INCLUDE_PATH=$(llvm-config --includedir)
export LIBRARY_PATH=$(llvm-config --libdir)

If you prefer Lmod, this .lua file should do it:

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"))

(That's for Mac, change DYLD to LD for Linux)

This work fine with CMake, it picks up -fopenmp. Compiling by hand only requires that one flag, as well.

Henry Schreiner
  • 905
  • 1
  • 7
  • 18