CMake 找不到 OpenMP

问题描述 投票:0回答:6

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

cmake openmp
6个回答
36
投票

CMake 即使在 2.x 版本中也具有 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()

17
投票

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

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

绝对不应该做是手动添加像

-fopenmp
这样的标志(就像接受的答案建议的那样),因为这可能不可移植。


6
投票

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

当使用

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fopenmp")

 时,
OpenMP
激活
C
来编译
gcc
源。对于其他编译器,您应该首先检测编译器,然后添加适当的标志


0
投票

iNFINITEi 的答案对我不起作用。 我使用 Ubuntu,尝试使用

OpenCV
静态库编译一些代码。链接后,我得到了这个:

'"/usr/bin/ld: /usr/local/lib/libopencv_core.a(parallel.cpp.o): 对符号 'omp_set_dynamic@@OMP_1.0'"'

的未定义引用

所以我尝试了iNFINITEi的方法,然后我有:

'CMake 错误位于 /usr/local/share/cmake-3.13/Modules/FindPackageHandleStandardArgs.cmake:211 (消息): 没有为 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
,解决了我的问题。


0
投票

我就遇到过这些情况,我的答案如下。 这两行位于 bashrc 中。所以我删除了这两行,问题就解决了。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/x86_64-linux-gnu/openmpi/lib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/x86_64-linux-gnu

我搜索了

CMakeCache.txt
文件。当编译没有问题时,出现了这些行。

//CXX compiler flags for OpenMP parallelization
OpenMP_CXX_FLAGS:STRING=-fopenmp

//CXX compiler libraries for OpenMP parallelization
OpenMP_CXX_LIB_NAMES:STRING=gomp;pthread

//C compiler flags for OpenMP parallelization
OpenMP_C_FLAGS:STRING=-fopenmp

//C compiler libraries for OpenMP parallelization
OpenMP_C_LIB_NAMES:STRING=gomp;pthread

//Path to the gomp library for OpenMP
OpenMP_gomp_LIBRARY:FILEPATH=/home/kimyoungho/anaconda3/envs/kimyoungho/x86_64-conda-linux-gnu/lib/libgomp.so

//Path to the pthread library for OpenMP
OpenMP_pthread_LIBRARY:FILEPATH=/home/kimyoungho/anaconda3/envs/kimyoungho/x86_64-conda-linux-gnu/sysroot/usr/lib/libpthread.so

编译出现问题时,出现了这些行。

//CXX compiler flags for OpenMP parallelization
OpenMP_CXX_FLAGS:STRING=-fopenmp

//CXX compiler libraries for OpenMP parallelization
OpenMP_CXX_LIB_NAMES:STRING=gomp;pthread

//C compiler flags for OpenMP parallelization
OpenMP_C_FLAGS:STRING=-fopenmp

//C compiler libraries for OpenMP parallelization
OpenMP_C_LIB_NAMES:STRING=gomp;pthread

//Path to the gomp library for OpenMP
OpenMP_gomp_LIBRARY:FILEPATH=/usr/lib/gcc/x86_64-linux-gnu/11/libgomp.so

//Path to the pthread library for OpenMP
OpenMP_pthread_LIBRARY:FILEPATH=/usr/lib/x86_64-linux-gnu/libpthread.a

我认为 LD_LIBRARY_PATH 无论如何都很重要。


-5
投票

您应该使用brew install libomp来安装libomp

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

© www.soinside.com 2019 - 2024. All rights reserved.