CMake cannot find OpenMP

24,720

Solution 1

OpenMp is not a package, if it's supported, it comes as a part of the your compiler. Try setting CMAKE_C_FLAGS or CMAKE_CXX_FLAGS accordingly. e.g:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fopenmp") activates OpenMP for compiling C sources when gcc is used. For other compilers, you should first detect the compiler and then add appropriate flags

Solution 2

CMake has a FindOpenMP module even in 2.x versions. See http://www.cmake.org/cmake/help/v3.0/module/FindOpenMP.html

So I'll do this:

OPTION (USE_OpenMP "Use OpenMP" ON)
IF(USE_OpenMP)
  FIND_PACKAGE(OpenMP)
  IF(OPENMP_FOUND)
    SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
  ENDIF()
ENDIF()

Solution 3

According to the Modern CMake online book, this is how you configure OpenMP support with CMake:

find_package(OpenMP)
if(OpenMP_CXX_FOUND)
    target_link_libraries(MyTarget PUBLIC OpenMP::OpenMP_CXX)
endif()

What you definitely should not do is to add flags like -fopenmp manually (like the accepted answer recommends) because that may not be portable.

Share:
24,720

Related videos on Youtube

Author by

ehuang

sometimes i code

Updated on May 12, 2021

Comments

  • ehuang over 1 year

    I am trying to compile with OpenMP. My CMakeLists.txt contains the line

    find_package(OpenMP REQUIRED)

    and CMake errors out with

    CMake Error at /opt/ros/groovy/share/catkin/cmake/catkinConfig.cmake:72 (find_package):
      Could not find a configuration file for package openmp.
      Set openmp_DIR to the directory containing a CMake configuration file for
      openmp.  The file will have one of the following names:
        openmpConfig.cmake
        openmp-config.cmake
    

    Checking my filesystem, I see that I have /usr/share/cmake-2.8/Modules/FindOpenMP.cmake but no openmpConfig.cmake or openmp-config.cmake. What do I need to do to fix this?

  • JonnyRo
    JonnyRo over 9 years
    stackoverflow.com/questions/3134660/… had an interesting solution in which CMake checks if the flag is supported using a macro. Sort of the logical expansion of your solution.
  • iNFINITEi over 7 years
    There is FindOpenMP cmake module. See cmake.org/cmake/help/v3.0/module/FindOpenMP.html
  • Pubudu
    Pubudu about 6 years
    Thank you very much for this! Exactly what I needed :D
  • David Doria
    David Doria almost 6 years
    @GradGuy I am using CMake 3.7 and clang 4.0 but my find_package(OpenMP REQUIRED) fails to find OpenMP.
  • mmirzadeh almost 6 years
    @DavidDoria Clang used to have problems with OpenMP, specially on OSX, but it looks like the new version should work fine. Can you build a simple OpenMP test with your version of clang?
  • David Doria
    David Doria almost 6 years
    @GradGuy You mean with Clang I don't even have to find_package(OpenMP)?
  • Alex Reinking
    Alex Reinking over 1 year
    This is the ONLY correct answer on this page.
  • ChrisZZ
    ChrisZZ 9 months
    The pastes cmake lines is cool, brief, portable. However, it failed on my qnx-aarch64 compiler, it just don't know where the openmp shared or static library locates, but I know where they are. What's worse, I can't tell CMake to find them! What a joke.

Related