cmake - 添加消毒剂仅用于调试 CMake 中的构建
问题描述
我正在尝试添加消毒剂以仅在 CMake 中调试构建。我认为:
通常你会像这样添加消毒剂:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address,undefined")
为了与 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_<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>
是构建类型的大写变体。
推荐阅读
- typescript - 在 Firebase Cloud Functions 单元测试中验证 Firestore 写入结果
- c++ - 在 C++ 中让一个数组指向另一个具有不同边界的数组
- android - MotionLayout - clicking on the layout behaves incorrectly
- asp.net - 如何查找 URL 注册(不是预订)?
- unity3d - 仅显示部分纹理
- javascript - 如何在撇号中重构客户端 js
- richfaces - RichFaces 4.5 - a4j:commandButton:oncomplete 未触发
- arrays - ReactJS setState 多维数组变量键在子数组中
- vb.net - 查找非活动 Windows vpn 名称
- fortran - 计算距离函数的有效方法