如何配置CMake/GCC以使用C99标准编译项目?
解决libvorbis编译时C++注释不兼容C90的问题
问题根源
Ubuntu 24上的GCC 13对C语言标准的默认处理更严格,或者你的项目CMake配置没有明确指定C语言版本,导致libvorbis的C文件被强制以ISO C90标准编译——而C90不支持//这种C++风格的单行注释,这就是报错的核心原因。
之前的机器能正常编译,大概率是因为:
- 旧机器的GCC版本较低(比如GCC 9及更早),默认对C文件采用
gnu90标准(允许//作为扩展特性); - 旧机器的CMake配置或环境变量里隐式指定了更高的C标准,新系统没有继承这些设置。
解决方案
1. 为目标明确指定C标准
在项目的CMakeLists.txt中,找到包含libvorbis代码的编译目标,添加以下配置(二选一即可):
- 采用严格C99标准(C99开始原生支持
//注释):
target_compile_features(your_target_name PRIVATE c_std_99) set(CMAKE_C_STANDARD_REQUIRED ON)
- 采用带GNU扩展的C99标准(兼容性更好,适配老代码):
target_compile_features(your_target_name PRIVATE gnu99)
如果要全局生效(所有C文件统一用这个标准),可以在CMakeLists开头设置:
set(CMAKE_C_STANDARD 99) set(CMAKE_C_EXTENSIONS ON) # 启用GNU扩展特性
2. 针对libvorbis子模块单独设置
如果libvorbis是通过add_subdirectory(libvorbis)作为子目录引入的,在引入前临时设置兼容标准,避免影响项目其他部分:
# 保存原有标准配置 set(OLD_C_STANDARD ${CMAKE_C_STANDARD}) set(OLD_C_EXTENSIONS ${CMAKE_C_EXTENSIONS}) # 为libvorbis设置兼容标准 set(CMAKE_C_STANDARD 99) set(CMAKE_C_EXTENSIONS ON) add_subdirectory(libvorbis) # 恢复原有项目的标准配置 set(CMAKE_C_STANDARD ${OLD_C_STANDARD}) set(CMAKE_C_EXTENSIONS ${OLD_C_EXTENSIONS})
3. 临时编译时指定(快速验证)
如果不想修改CMake配置,可以在运行cmake时直接传递编译选项:
cmake .. -DCMAKE_C_FLAGS="-std=gnu99"
内容的提问来源于stack exchange,提问作者Omroth
相关产品推荐
相关产品推荐

