我正在尝试使用 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 即使在 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()
根据 Modern CMake 在线书籍,这是使用 CMake 配置 OpenMP 支持的方法:
find_package(OpenMP)
if(OpenMP_CXX_FOUND)
target_link_libraries(MyTarget PUBLIC OpenMP::OpenMP_CXX)
endif()
你绝对不应该做是手动添加像
-fopenmp
这样的标志(就像接受的答案建议的那样),因为这可能不可移植。
OpenMp
不是一个包,如果支持,它会作为编译器的一部分提供。尝试相应地设置 CMAKE_C_FLAGS
或 CMAKE_CXX_FLAGS
。例如:
当使用 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fopenmp")
时,
OpenMP
激活 C
来编译 gcc
源。对于其他编译器,您应该首先检测编译器,然后添加适当的标志
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
,解决了我的问题。
我就遇到过这些情况,我的答案如下。 这两行位于 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 无论如何都很重要。
您应该使用brew install libomp来安装libomp
我使用 macOS,它对我来说运行顺利。