CMake无法找到OpenMP

时间:2013-07-13 19:28:46

标签: cmake openmp

我正在尝试使用OpenMP进行编译。我的CMakeLists.txt包含

find_package(OpenMP REQUIRED)

和CMake错误

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

检查我的文件系统,我发现我有/usr/share/cmake-2.8/Modules/FindOpenMP.cmake但没有openmpConfig.cmakeopenmp-config.cmake。我需要做些什么来解决这个问题?

5 个答案:

答案 0 :(得分:27)

即使在2.x版本中,CMake也有一个FindOpenMP模块。见http://www.cmake.org/cmake/help/v3.0/module/FindOpenMP.html

所以我会这样做:

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

答案 1 :(得分:7)

OpenMp不是包,如果它受支持,它作为编译器的一部分。请尝试相应地设置CMAKE_C_FLAGSCMAKE_CXX_FLAGS。 e.g:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fopenmp")激活OpenMP,以便在使用C时编译gcc来源。对于其他编译器,您应首先检测编译器,然后添加适当的标志

答案 2 :(得分:3)

根据 Modern CMake 在线书籍,这是使用 CMake 配置 OpenMP 支持的方式:

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

绝对不应该做的是手动添加 -fopenmp 之类的标志(如已接受的答案所建议的那样),因为这可能无法移植。

答案 3 :(得分:0)

iNFINITEi的答案对我不起作用。 我使用Ubuntu,尝试使用OpenCV静态库编译一些代码。链接后,我得到了:

  

'“ / usr / bin / ld:/usr/local/lib/libopencv_core.a(parallel.cpp.o):未定义对符号'omp_set_dynamic @@ OMP_1.0'”'的引用

所以我尝试了iNFINITEi的方法,然后得到了

  

在/usr/local/share/cmake-3.13/Modules/FindPackageHandleStandardArgs.cmake:211(消息)的CMake错误:     没有为FIND_PACKAGE_HANDLE_STANDARD_ARGS()指定REQUIRED_VARS   呼叫堆栈(最近的呼叫优先):     /usr/local/share/cmake-3.13/Modules/FindOpenMP.cmake:513(find_package_handle_standard_args)     CMakeLists.txt:8(FIND_PACKAGE)'

最后,我将"-fopenmp=libomp"添加到CMAKE_CXX_FLAGS,解决了我的问题。

答案 4 :(得分:-2)

您应该使用brew install libomp安装libomp

我使用macOS,它对我来说运行顺利。