21

我正在尝试使用 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.cmakeor openmp-config.cmake。我需要做什么来解决这个问题?

4

5 回答 5

33

即使在 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()
于 2015-03-01T10:42:04.113 回答
8

OpenMp不是一个包,如果它受支持,它会作为编译器的一部分提供。尝试设置CMAKE_C_FLAGSCMAKE_CXX_FLAGS相应。例如:

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

于 2013-07-13T19:40:38.443 回答
7

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

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

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

于 2021-05-11T12:52:28.357 回答
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,解决了我的问题。

于 2019-08-09T01:18:16.210 回答
-3

您应该使用 brew install libomp 安装 libomp

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

于 2020-05-28T17:48:23.513 回答