0Pricing
C++ Academy · 课时

目标、链接与可见性: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 反馈 — 无需本地设置。

此课程中的所有课时

  1. CMake 项目布局与 CMakeLists.txt
  2. 目标、链接与可见性:PUBLIC、PRIVATE
  3. 使用 vcpkg 和 Conan 管理依赖
  4. 生成 IDE 文件与跨平台构建
← 返回 C++ Academy