You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写CMakeLists.txt实现与指定Makefile等效的多目标编译?

解决CMake自定义debug目标编译选项报错问题

你遇到的target_compile_definitions called with non-compilable target type错误,原因是add_custom_target(debug)创建的是自定义目标——这类目标仅用于执行命令,不参与源代码编译流程,因此target_compile_definitions无法作用于它(该命令仅支持可执行文件、库等可编译目标)。

以下是两种可行的解决方案:

方案一:利用CMake原生构建类型(推荐)

CMake自带Debug、Release等构建类型,我们可以为Debug类型配置所需编译选项,再创建自定义debug目标触发Debug模式构建:

cmake_minimum_required(VERSION 3.12)

set(PROJ_NAME "proj")

project(${PROJ_NAME} CXX)

add_executable(${PROJ_NAME} main.cpp)

# 为Debug构建类型添加指定编译选项
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUG -g -Og")

# 自定义debug目标,触发Debug模式构建
add_custom_target(debug
    COMMAND ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Debug --build ${CMAKE_BINARY_DIR} --target ${PROJ_NAME}
    COMMENT "Building with debug flags..."
)

使用方式:

  • 默认构建:make
  • Debug构建:make debug

方案二:直接在自定义目标中执行编译命令(贴近原Makefile逻辑)

如果不想依赖CMake的构建类型系统,可以直接在debug目标中调用编译器并传递选项,逻辑和原Makefile完全一致:

cmake_minimum_required(VERSION 3.12)

set(PROJ_NAME "proj")

project(${PROJ_NAME} CXX)

add_executable(${PROJ_NAME} main.cpp)

# 自定义debug目标,直接执行编译命令
add_custom_target(debug
    COMMAND ${CMAKE_CXX_COMPILER} -DDEBUG -g -Og main.cpp -o ${PROJ_NAME}
    COMMENT "Building with debug flags..."
)

注意:这种方式没有利用CMake的依赖追踪功能,若后续新增源文件,需要手动更新编译命令。

内容的提问来源于stack exchange,提问作者Dmitri Ranfft

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 09:07:41