如何将批量生成可执行文件的逻辑从make all移除并设为独立CMake目标
CMake 从默认构建中剥离示例程序、实现独立
examples构建目标的方案 核心实现逻辑
搭配两个CMake原生能力即可落地需求:
- 给单个编译生成的示例可执行文件加
EXCLUDE_FROM_ALL标记,让这类目标不被默认的all构建流程收录。 - 新建一个独立的自定义总目标
examples,把所有单个示例可执行文件作为它的依赖,只有显式触发这个目标的构建时,才会连带编译所有关联的示例程序。
可直接使用的CMake代码
# 创建独立的 examples 总目标,不加 ALL 参数,保证自身也不纳入默认构建 add_custom_target(examples) foreach (FILE ${EXAMPLE_FILES}) # 从源文件路径提取不带后缀的文件名,作为每个示例的唯一可执行文件名,避免目标重名 get_filename_component(EXAMPLE_TARGET_NAME ${FILE} NAME_WE) # 添加带 EXCLUDE_FROM_ALL 标记的可执行目标,默认不随 make all 构建 add_executable(${EXAMPLE_TARGET_NAME} EXCLUDE_FROM_ALL ${FILE}) # 将单个示例目标绑定为 examples 总目标的依赖 add_dependencies(examples ${EXAMPLE_TARGET_NAME}) endforeach ()
实际效果
- 执行
cmake .. && make时,CMake会正常编译项目主程序,完全跳过所有示例源文件的编译流程,不会生成任何示例可执行文件。 - 执行
make examples时,会自动遍历编译EXAMPLE_FILES列表中的所有cpp文件,为每个文件生成对应的独立可执行文件。 - 这套逻辑对多生成器(Make、Ninja、VS、Xcode)均兼容,IDE场景下会自动在项目中生成名为
examples的独立目标分组,默认构建不会触发组内文件编译。
补充说明:原始示例代码中循环内所有可执行文件都使用同一个
${TARGET_NAME}是简化写法,实际CMake要求每个构建目标必须有唯一名称,否则会触发重定义报错,因此实现时需要为每个源文件匹配独立的可执行文件名。
内容的提问来源于stack exchange,提问作者vsoftco
相关产品推荐
相关产品推荐

