如何在Make阶段为GCC额外传递-fdiagnostics-json编译标志?
解决CMake项目在Make阶段选择性添加GCC诊断标志的问题
首先说清楚为什么你直接用make CXXFLAGS="-fdiagnostics-format=json"无效:CMake生成的Makefile会自行管理CXXFLAGS变量,它由CMAKE_CXX_FLAGS、CMAKE_CXX_FLAGS_DEBUG等CMake定义的变量组合而成,外部传入的CXXFLAGS会被Makefile里的赋值覆盖,所以不起作用。
给你两个可行的方案:
方案一:通过环境变量传递额外编译标志(推荐)
在项目根目录的CMakeLists.txt里添加一行代码,让CMake读取自定义环境变量作为额外编译标志:
# 允许通过环境变量EXTRA_CXX_FLAGS追加额外编译选项 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} $ENV{EXTRA_CXX_FLAGS}")
日常编译直接正常执行make即可;需要JSON诊断输出时,只需在执行make前设置环境变量:
EXTRA_CXX_FLAGS="-fdiagnostics-format=json" make
这个方法不会触发全量重建——因为只是追加了一个不影响生成二进制的诊断标志,CMake不会重新生成整个Makefile,只会在本次编译中把该标志传给GCC。
方案二:通过CMake缓存变量动态切换
如果不想用环境变量,也可以在CMakeLists.txt里添加一个开关选项:
option(ENABLE_JSON_DIAGNOSTICS "启用GCC的JSON格式诊断输出" OFF) if(ENABLE_JSON_DIAGNOSTICS) add_compile_options(-fdiagnostics-format=json) endif()
第一次开启该选项时需要执行cmake .. -DENABLE_JSON_DIAGNOSTICS=ON,但之后临时切换无需重新运行cmake,直接在make时传递变量即可:
make ENABLE_JSON_DIAGNOSTICS=ON
注意:第一次从OFF切换到ON时,CMake会重新生成部分Makefile,可能触发一次全量编译,但后续再切换时,因该标志不影响二进制内容,只会编译必要文件。
内容的提问来源于stack exchange,提问作者doraemon
相关产品推荐
相关产品推荐

