CMake中如何将gnu++17编译器标志追加到C++编译命令末尾?
我之前也碰到过一模一样的CMake编译标准覆盖问题,简直头疼!关键原因是编译器会优先采用命令行最后出现的-std参数,所以我们要做的就是让-std=gnu++17排在所有标准设置的后面。下面给你几个实操性强的解决方案:
方案1:用CMake原生变量正确配置GNU++17(最推荐)
你之前直接把gnu++17塞到CMAKE_CXX_FLAGS里其实是绕了弯路,CMake本身有专门的变量组合来处理带GNU扩展的C++标准,完全不用手动拼编译参数:
- 设置
CMAKE_CXX_STANDARD为数字17(注意是数字,不是带gnu-前缀的字符串),这告诉CMake我们要使用C++17标准 - 设置
CMAKE_CXX_EXTENSIONS为ON,这会让CMake自动生成带GNU扩展的标准参数,也就是-std=gnu++17 - 可选但建议加上
CMAKE_CXX_STANDARD_REQUIRED为ON,强制要求编译器支持C++17,避免CMake自动回退到旧版本标准
把这段代码放在你的CMakeLists.txt最开头(添加任何目标之前):
cmake_minimum_required(VERSION 3.8) # 至少3.8版本才能完整支持C++17的配置 project(your_project_name) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_EXTENSIONS ON) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 接下来正常添加你的目标 add_executable(your_target main.cpp)
这样CMake会自动生成干净的编译命令,不会出现重复的-std参数,而且会直接使用gnu++17作为生效标准。
方案2:针对目标强制追加-std=gnu++17(兼容旧项目)
如果因为项目限制没法用方案1,比如依赖的旧配置硬塞了旧标准,那可以直接给目标添加编译选项——CMake会把目标级别的选项放在全局选项的后面,自然就能覆盖之前的-std设置:
# 假设你的可执行目标名为your_target add_executable(your_target main.cpp) # 用PRIVATE确保这个选项只作用于当前目标,不传递给依赖 target_compile_options(your_target PRIVATE "-std=gnu++17")
这种方式的好处是精准控制,只修改你需要的目标,不会影响项目里的其他模块。
方案3:排查并清除旧的标准设置
如果还是出现-std=gnu++11,那肯定是你的项目或者依赖的配置里有地方偷偷设置了旧标准。你可以:
- 全局搜索项目里所有的CMake配置文件,找有没有
set(CMAKE_CXX_STANDARD 11)或者类似的代码,直接改成17 - 如果是第三方依赖带来的旧设置,在运行CMake时通过命令行参数强制覆盖:
cmake .. -DCMAKE_CXX_STANDARD=17 -DCMAKE_CXX_EXTENSIONS=ON
最后再强调一遍:编译器的-std参数是最后出现的优先级最高,只要确保我们需要的-std=gnu++17在命令行的最后位置,就能稳稳覆盖之前的旧标准设置。
内容的提问来源于stack exchange,提问作者user9392253
相关产品推荐
相关产品推荐

