CMake中的"target"(目标)是什么?请结合add_executable等给出通俗解释
CMake中"Target"(目标)的通俗解释
你可以把CMake里的Target理解成项目里的「待生产产品」——它是CMake帮你构建的最终产物单元,每一个target都对应一个具体的输出文件,比如可执行程序、静态库、动态库。CMake通过target来管理这个产物的所有构建规则:用哪些源码、依赖什么库、编译参数是什么、输出到哪里,全绑定在这个target上。
1. add_executable 里的Target:可执行程序产物
当你写add_executable(my_app main.cpp utils.cpp)时,就是在告诉CMake:我要生成一个名为my_app的target,这个target对应的产物是可执行文件(比如Windows下的.exe,Linux下的无后缀可执行文件),构建它需要用到main.cpp和utils.cpp这两个源码文件。
这个my_app作为可执行target,后续你可以给它追加各种构建规则:
- 用
target_include_directories(my_app PRIVATE ./include)指定它需要的头文件路径; - 用
target_link_libraries(my_app PRIVATE my_lib)让它链接另一个库target; - 用
target_compile_options(my_app PRIVATE -Wall)给它添加编译警告参数。
2. add_library 里的Target:库文件产物
add_library用来创建库类型的target,常见的有三种:
- 静态库(默认类型,比如Linux下的
.a,Windows下的.lib):add_library(my_lib STATIC lib.cpp) - 动态库(Linux下的
.so,Windows下的.dll):add_library(my_lib SHARED lib.cpp) - 接口库(仅包含头文件,无编译源码):
add_library(my_lib INTERFACE)
这里的my_lib就是一个库target,作用是封装一组代码逻辑,供其他target(比如上面的my_app)调用。你同样可以给它配置专属规则:
- 用
target_include_directories(my_lib PUBLIC ./lib_include),这样所有链接my_lib的target都会自动继承这个头文件路径; - 用
target_compile_definitions(my_lib PRIVATE LIB_DEBUG)给库的源码添加编译宏。
核心逻辑总结
- 每个target都是CMake构建的基本单元,一个项目可以同时存在多个target(比如一个可执行文件+多个依赖库);
- target之间可以建立依赖关系(比如可执行target依赖库target),CMake会自动处理构建顺序(先编译依赖库,再编译可执行文件);
- 所有针对产物的配置都绑定在target上,避免了全局配置的混乱,让项目结构更清晰。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

