Ubuntu16.04与CMake3.5下FindOpenMP报错:需启用C/CXX语言
解决CMake配置OpenMP程序失败的问题
我太懂你这种憋屈感了——直接用gcc main.c -fopenmp -o run编译OpenMP程序顺得不行,换成CMake生成Makefile就各种报错,明明OpenMP和GCC都没问题,问题肯定出在CMake配置上!
先看你给出的CMakeLists.txt片段,能看到你已经在尝试查找OpenMP包,但大概率是踩了几个常见的小坑。下面给你梳理正确的配置方式,以及你可能出错的点:
正确的C程序CMakeLists.txt配置
cmake_minimum_required(VERSION 3.5.0) # 明确指定项目语言为C,帮助CMake精准查找对应组件 project(OpenMPHelloWorld C) # 查找OpenMP包,REQUIRED表示找不到就直接报错 find_package(OpenMP REQUIRED) # 检查C语言的OpenMP支持是否正常 if(OpenMP_C_FOUND) # 给C编译器添加OpenMP编译选项 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") # 生成可执行文件,对应你的main.c add_executable(run main.c) # 关键!链接OpenMP的官方导入目标,确保所有必要的链接参数都被正确添加 target_link_libraries(run PRIVATE OpenMP::OpenMP_C) endif()
如果是C++程序,只需要把语言和对应变量换成CXX即可:
cmake_minimum_required(VERSION 3.5.0) project(OpenMPHelloWorld CXX) find_package(OpenMP REQUIRED) if(OpenMP_CXX_FOUND) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") add_executable(run main.cpp) target_link_libraries(run PRIVATE OpenMP::OpenMP_CXX) endif()
你可能踩的坑
- 忘记链接OpenMP库:很多人以为加了
-fopenmp编译选项就万事大吉,但实际上CMake里需要显式链接OpenMP的库组件。用target_link_libraries关联OpenMP::OpenMP_C(或CXX)导入目标,能自动处理所有链接相关的参数,避免手动设置遗漏。 - 变量拼写错误:你写的
CMAKE_CXX_FL...明显没写完,要注意是CMAKE_CXX_FLAGS,别打错字母。另外,新版本CMake更推荐用OpenMP_C_FOUND/OpenMP_CXX_FOUND来判断对应语言的OpenMP支持,比旧的OPENMP_FOUND更精准。 - 未指定项目语言:没写
project指令的话,CMake可能会默认检测语言,但明确指定能减少不必要的问题。
更简洁的现代CMake写法(CMake 3.12+)
如果你的CMake版本在3.12及以上,推荐用更模块化的方式,直接针对目标设置选项,不污染全局变量:
cmake_minimum_required(VERSION 3.12.0) project(OpenMPHelloWorld C) # 先定义可执行目标 add_executable(run main.c) # 查找OpenMP并给目标设置编译和链接选项 find_package(OpenMP REQUIRED) target_compile_options(run PRIVATE ${OpenMP_C_FLAGS}) target_link_libraries(run PRIVATE OpenMP::OpenMP_C)
验证步骤
- 把上述配置文件放到和
main.c同目录下 - 创建并进入build目录:
mkdir build && cd build - 运行CMake生成Makefile:
cmake .. - 编译:
make - 运行程序:
./run
这样应该就能和直接用gcc编译一样顺利生成可执行文件了!
内容的提问来源于stack exchange,提问作者Piotr Januszewski




