首页 > 解决方案 > 添加消毒剂仅用于调试 CMake 中的构建

问题描述

我正在尝试添加消毒剂以仅在 CMake 中调试构建。我认为:

  1. 通常你会像这样添加消毒剂:

    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address,undefined")
    
  2. 为了与 Visual Studio(和其他多配置生成器)兼容,我需要使用生成器表达式

    $<$<CONFIG:Debug>:-fsanitize=address,undefined>
    

    而不是例如if(CMAKE_BUILD_TYPE STREQUAL "Debug")

那么我该如何组合它们呢?我试过

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} $<$<CONFIG:Debug>:-fsanitize=address,undefined>")

set(SANITIZE_FLAGS "$<$<CONFIG:Debug>:-fsanitize=address,undefined>")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SANITIZE_FLAGS}")

两者都导致错误看起来像

no such file or directory: '../../../src/ffn.cc../../../src/ffn.ccCONFIG:Debug'

标签: cmake

解决方案


仅为特定配置(构建类型)设置编译器标志的最简单方法是将这些标志附加到对应的 CMAKE_<LANG>_FLAGS_<CONFIG>变量:

# Add sanitizer flags for C++ compiler for "Debug" configuration
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fsanitize=address,undefined")

这种方式在 Visual Studio 等多配置生成器的情况下非常有效。


设置CMAKE_<LANG>_FLAGS_<CONFIG>变量甚至适用于自定义构建类型。这<CONFIG>是构建类型的大写变体。


推荐阅读