如何在CMake中使用EXCLUDE_FROM_ALL属性?
CMake EXCLUDE_FROM_ALL 属性用法说明
核心作用
EXCLUDE_FROM_ALL 是作用于CMake目标(库、可执行文件、自定义目标等)的布尔属性,核心效果是标记目标默认不参与全局构建流程:
- 日常执行全局构建命令(如
make、ninja、点击IDE「全部构建」按钮)时,带该属性的目标不会被编译、链接生成产物 - 只有当你主动显式指定构建该目标(如执行
make your_target_name、IDE中单独选中目标构建)时,才会生成对应的产物
这个属性通常用于标记测试工具、示例程序、可选插件等不需要每次全量构建都生成的目标,能大幅减少日常开发的构建耗时。
不同构建指令中的用法
1. add_library 用法
你给出的示例就是标准写法,直接在add_library参数中加入EXCLUDE_FROM_ALL即可开启属性:
add_library(foo STATIC EXCLUDE_FROM_ALL "src/foo.cpp")
等效于创建目标后单独设置属性的写法:
add_library(foo STATIC "src/foo.cpp") set_target_properties(foo PROPERTIES EXCLUDE_FROM_ALL TRUE)
2. add_executable 用法
和库的用法完全一致,直接在参数中添加标识即可,比如定义一个默认不构建的调试工具:
add_executable(debug_helper EXCLUDE_FROM_ALL "tools/debug.cpp")
3. 其他目标类型用法
该属性支持所有CMake目标类型,包括add_custom_target,写法规则相同。
注意事项
- 如果标记了
EXCLUDE_FROM_ALL的目标,被另一个未标记该属性的普通目标依赖,CMake会自动将该目标纳入全局构建流程,因为要满足依赖项的编译要求,该属性不会屏蔽依赖传递的构建规则。 - 若需要临时关闭某个目标的该属性,将属性值设为
FALSE即可:set_target_properties(foo PROPERTIES EXCLUDE_FROM_ALL FALSE)
内容的提问来源于stack exchange,提问作者Oleksandr Novik
相关产品推荐
相关产品推荐

