在CMake中基于Make目标设置CXX编译标志问题求助
解决CMake自定义debug目标触发-DDEBUG编译的问题
你的问题出在自定义debug目标的命令上:${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Debug没有指定构建/源码目录,导致CMake不会更新当前构建目录的缓存,所以CMAKE_BUILD_TYPE始终保持之前的设置,自然-DDEBUG不会按需生效。
下面提供两种可行的解决方案:
方案一:切换当前构建目录的构建类型
这种方案会修改当前构建目录的缓存,执行make debug后,后续直接执行make会默认构建Debug版本;若要回到Release,需要手动执行cmake -DCMAKE_BUILD_TYPE=Release .。
修改后的CMakeLists.txt配置:
# 默认设置为Release构建类型 if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE) endif() # 自定义debug目标:先更新构建类型为Debug,再执行构建 add_custom_target(debug COMMAND ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Debug . COMMAND ${CMAKE_COMMAND} --build . COMMENT "构建带-DDEBUG的Debug版本" ) # 目标编译选项保持不变 target_compile_options(my_target PRIVATE $<$CONFIG:Debug:-g -DDEBUG> $<$CONFIG:Release:-O2> )
方案二:使用独立的Debug构建目录(推荐)
这种方案会在单独的子目录中构建Debug版本,完全不影响默认的Release构建,两者可以共存。
修改后的CMakeLists.txt配置:
# 默认设置为Release构建类型 if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE) endif() # 自定义debug目标:在debug子目录中独立构建Debug版本 add_custom_target(debug COMMAND mkdir -p ${CMAKE_BINARY_DIR}/debug COMMAND ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Debug ${CMAKE_SOURCE_DIR} -B ${CMAKE_BINARY_DIR}/debug COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}/debug COMMENT "在独立目录构建带-DDEBUG的Debug版本" ) # 目标编译选项保持不变 target_compile_options(my_target PRIVATE $<$CONFIG:Debug:-g -DDEBUG> $<$CONFIG:Release:-O2> )
使用方式:
- 执行
make:构建默认的Release版本,#ifdef DEBUG代码不生效 - 执行
make debug:构建Debug版本,#ifdef DEBUG代码生效
内容的提问来源于stack exchange,提问作者Zachary Ellis
相关产品推荐
相关产品推荐

