CMake自定义构建、运行及清理命令实现方法咨询
实现CMake自定义构建与清理目标
嘿,作为CMake新手,你的需求完全可行!CMake提供了add_custom_target命令,专门用来创建这类自定义的构建/操作目标,完美替代你想要的Makefile风格make all/make clean功能。下面一步步给你拆解实现:
1. 构建并运行项目的自定义目标
假设你已经用add_executable定义了项目的可执行文件目标(比如叫my_project),我们可以创建一个run目标,让它自动完成构建可执行文件 → 运行程序的流程:
# 先定义你的可执行目标(根据你的实际项目调整文件名和源文件) add_executable(my_project src/main.cpp) # 创建自定义run目标 add_custom_target(run COMMAND ./my_project # 运行生成的可执行文件 DEPENDS my_project # 依赖:必须先完成my_project的构建才能运行 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} # 指定在构建目录下执行命令 COMMENT "Building and running the project..." )
使用方式
在你的构建目录(比如build/)下,执行:
make run # 如果用Makefile生成器 # 或者如果你用Ninja的话: ninja run
这条命令会先自动构建你的项目(如果有代码变更),然后立刻运行生成的可执行文件,完全替代你手动敲cmake .. && make && ./project_name的流程。
2. 清空构建目录的自定义清理目标
CMake自带的make clean只会删除编译生成的二进制文件、中间产物,但不会删除CMake自动生成的配置文件(比如CMakeCache.txt、Makefile本身)。如果你想要完全清空构建目录(类似rm -rf *的效果),可以创建一个distclean目标:
add_custom_target(distclean COMMAND rm -rf * # 清空当前目录下所有内容 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} # 指定在构建目录执行 COMMENT "Cleaning the entire build directory..." )
使用方式
在构建目录下执行:
make distclean # 或者 ninja distclean
执行后你的构建目录会被完全清空,回到和刚创建时一样的状态,方便重新从头构建。
额外小贴士
- 如果你的项目有多个可执行目标,记得在
DEPENDS里指定正确的目标名称,确保run目标只会构建并运行你需要的那个程序。 - 如果你用的是Windows平台,
rm -rf *要换成对应的PowerShell命令:Remove-Item * -Recurse -Force,可以通过CMake的条件判断来适配不同系统:if(UNIX) set(CLEAN_COMMAND rm -rf *) else() set(CLEAN_COMMAND Remove-Item * -Recurse -Force) endif() add_custom_target(distclean COMMAND ${CLEAN_COMMAND} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT "Cleaning the entire build directory..." )
内容的提问来源于stack exchange,提问作者Roy Carter




