咨询CMake中target_compile_options的PRIVATE与PUBLIC区别及示例效果
CMake中target_compile_options的PRIVATE与PUBLIC作用域区别
CMake里的target_compile_options作用域本质是控制编译选项的依赖传递性,PRIVATE和PUBLIC的核心区别就在这里:
PRIVATE 作用域
用PRIVATE指定的编译选项,只影响当前目标的编译,不会传递给任何依赖它的目标。
举个例子:
target_compile_options(main PRIVATE -Wall)
这个配置只会在编译main目标的源文件时启用-Wall(开启所有警告)。假设你有另一个目标utils,通过target_link_libraries(utils PRIVATE main)依赖main,编译utils的源文件时完全不会用到-Wall选项。
PUBLIC 作用域
用PUBLIC指定的编译选项,既会作用于当前目标的编译,也会传递给所有直接依赖该目标的其他目标。
还是用-Wall举例:
target_compile_options(main PUBLIC -Wall)
效果分两部分:
- 编译
main自身的源文件时,会启用-Wall; - 如果有目标
app通过target_link_libraries(app PRIVATE main)依赖main,那么编译app的源文件时,CMake会自动把-Wall加进去。
简单总结:
- PRIVATE:自己用,不给别人
- PUBLIC:自己用,也给直接依赖我的人
内容的提问来源于stack exchange,提问作者Diego De Leonardis
相关产品推荐
相关产品推荐

