如何编写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
相关产品推荐
相关产品推荐

