我正在尝试使用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
。我需要做些什么来解决这个问题?
答案 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_FLAGS
或CMAKE_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,它对我来说运行顺利。