目标、链接与可见性:PUBLIC、PRIVATE
定义目标、链接库,并正确使用 PUBLIC、PRIVATE 和 INTERFACE 可见性
目标、链接与可见性:PUBLIC、PRIVATE 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。
目标是构建单元
现代 CMake 以目标为核心,包括可执行文件、库或仅包含接口的集合。属性会附加到目标,并通过链接传播。
添加目标
使用 add_executable、add_library 或 add_library(... INTERFACE)。
add_executable(myapp src/main.cpp)
add_library(mylib STATIC src/lib.cpp)
add_library(headers INTERFACE)target_link_libraries
将目标链接到库。第三个参数控制可见性。
target_link_libraries(myapp PRIVATE mylib)PUBLIC PRIVATE INTERFACE 可见性
三种可见性级别用于控制依赖项是否传播给使用此目标的消费者:
- PRIVATE — 用于构建此目标,不对外公开
- INTERFACE — 供消费者使用,不供此目标使用
- PUBLIC — 两者都适用
可视化传播过程
如果 mylib 将 fmt 作为 PUBLIC 依赖进行链接,那么任何链接 mylib 的目标也会获得 fmt 的包含目录。PRIVATE 表示消费者看不到 fmt。
target_include_directories
为每个目标设置包含目录。对于消费者会使用 #include 的头文件,请使用 PUBLIC;对于内部头文件,请使用 PRIVATE。
target_include_directories(mylib
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src
)target_compile_definitions
为目标设置预处理器宏。
target_compile_definitions(mylib PUBLIC MYLIB_VERSION_MAJOR=1)target_compile_features
请求特定的语言特性(例如某个 C++ 标准)。
target_compile_features(mylib PUBLIC cxx_std_20)接口库
INTERFACE 库没有编译输出。可以使用它来捆绑编译选项、头文件或链接关系,使消费者能够继承这些内容。
add_library(strict_warnings INTERFACE)
target_compile_options(strict_warnings INTERFACE -Wall -Wextra)
# now any target can opt in
target_link_libraries(myapp PRIVATE strict_warnings)仅头文件库
对于仅头文件库,请声明一个 INTERFACE 库,并将包含目录设置为 INTERFACE。
别名
创建带命名空间的别名,让链接命令更加清晰。
add_library(MyProject::mylib ALIAS mylib)
target_link_libraries(consumer PRIVATE MyProject::mylib)链接顺序
CMake 通常能够正确解析链接顺序。对于棘手的循环依赖情况,请使用 --start-group 链接器标志,或重构库结构。
常见错误:全局 include_directories
请避免使用全局 include_directories 命令。使用 target_include_directories,使头文件只附加到特定目标。
快速检查
对于链接 mylib 的目标,target_link_libraries(mylib PUBLIC fmt) 表示什么?
回顾
现代 CMake 使用目标作为工作单元。请使用 target_* 命令设置属性,并使用 PUBLIC/PRIVATE/INTERFACE 控制属性如何传播给消费者。
常见问题解答
「目标、链接与可见性:PUBLIC、PRIVATE」课时是免费的吗?
是的 — 「目标、链接与可见性:PUBLIC、PRIVATE」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。
「目标、链接与可见性:PUBLIC、PRIVATE」这节课中我会学到什么?
定义目标、链接库,并正确使用 PUBLIC、PRIVATE 和 INTERFACE 可见性 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C++ Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「目标、链接与可见性:PUBLIC、PRIVATE」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C++ Academy 课中编写并运行代码吗?
能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- CMake 项目布局与 CMakeLists.txt
- 目标、链接与可见性:PUBLIC、PRIVATE
- 使用 vcpkg 和 Conan 管理依赖
- 生成 IDE 文件与跨平台构建