使用clang-12编译器时CMake的find_package(OpenMP)无法找到OpenMP问题咨询
问题原因
Ubuntu 20.04 下的 clang-12 默认没有内置 OpenMP 的编译、链接路径配置,你安装的 libomp-dev 属于 LLVM 官方的 OpenMP 运行库,CMake 默认的 FindOpenMP 模块没有适配 Clang 的这一特性,因此无法直接识别到 OpenMP 库。
修复方案
你可以通过在 CMakeLists.txt 中预先针对 Clang 编译器配置 OpenMP 相关参数解决该问题,修改后的完整配置如下:
cmake_minimum_required(VERSION 3.20) project(你的项目名称) # 按需替换为你的项目名 set(CMAKE_C_STANDARD 11) set(GCC_COMPILE_FLAGS -Wall -Werror -Wvla -O0) set(CMAKE_BUILD_TYPE Debug) # 针对Clang编译器配置OpenMP参数 if(CMAKE_C_COMPILER_ID MATCHES "Clang") set(OpenMP_C_FLAGS "-fopenmp=libomp" CACHE STRING "" FORCE) set(OpenMP_C_LIB_NAMES "omp" CACHE STRING "" FORCE) set(OpenMP_omp_LIBRARY "/usr/lib/x86_64-linux-gnu/libomp.so" CACHE FILEPATH "" FORCE) endif() if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") set(OpenMP_CXX_FLAGS "-fopenmp=libomp" CACHE STRING "" FORCE) set(OpenMP_CXX_LIB_NAMES "omp" CACHE STRING "" FORCE) set(OpenMP_omp_LIBRARY "/usr/lib/x86_64-linux-gnu/libomp.so" CACHE FILEPATH "" FORCE) endif() # 查找OpenMP find_package(OpenMP REQUIRED) if (OPENMP_FOUND) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}") endif()
注意事项
- 每次修改配置后需要删除旧的 CMake 缓存(执行
rm -rf CMakeCache.txt CMakeFiles)再重新执行 cmake 命令,避免缓存干扰 - 如果你的系统是 arm 等非 x86 架构,可以执行
dpkg -L libomp-dev | grep libomp.so查询本地库的实际安装路径,替换 CMake 配置中的对应路径 - 如果你不想把路径写死在 CMakeLists.txt 中,也可以直接在执行 cmake 命令时传递相关参数:
cmake .. -DCMAKE_C_COMPILER=/usr/bin/clang-12 -DCMAKE_CXX_COMPILER=/usr/bin/clang++-12 \ -DOpenMP_C_FLAGS=-fopenmp=libomp -DOpenMP_CXX_FLAGS=-fopenmp=libomp \ -DOpenMP_C_LIB_NAMES=omp -DOpenMP_CXX_LIB_NAMES=omp \ -DOpenMP_omp_LIBRARY=/usr/lib/x86_64-linux-gnu/libomp.so
内容的提问来源于stack exchange,提问作者ptk
相关产品推荐
相关产品推荐

