如何让CMake使用gnu17 C标准而非ISO C17标准?
解决CMake设置GNU C17标准报错的问题
问题原因
CMake的C_STANDARD属性仅支持指定纯C语言标准版本号(如99、11、17),不接受带gnu前缀的扩展标准,因此直接设置gnu17会触发"invalid value"错误。
解决方案
方法1:通过CMake标准属性启用GNU扩展
先指定C标准版本,再开启C扩展支持,CMake会自动为GCC生成std=gnu17编译选项:
# 针对单个目标设置 set_property(TARGET "${MyProject_${Compile_Type}_NAME}" PROPERTY C_STANDARD 17) set_property(TARGET "${MyProject_${Compile_Type}_NAME}" PROPERTY C_STANDARD_REQUIRED ON) set_property(TARGET "${MyProject_${Compile_Type}_NAME}" PROPERTY C_EXTENSIONS ON) # 或者全局设置(作用于所有后续创建的目标) set(CMAKE_C_STANDARD 17) set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_C_EXTENSIONS ON)
注:C_EXTENSIONS默认值为ON,若之前被手动关闭过,需显式开启。
方法2:直接添加编译选项
如果旧版本CMake不支持上述属性组合,可直接手动传递-std=gnu17给编译器:
target_compile_options("${MyProject_${Compile_Type}_NAME}" PRIVATE -std=gnu17)
这种方式可直接控制编译参数,确保GCC使用GNU C17扩展标准,同时保留-pedantic警告级别对非扩展语法的检查。
内容的提问来源于stack exchange,提问作者Piotr Lopusiewicz
相关产品推荐
相关产品推荐

