CMake PUBLIC, PRIVATE and INTERFACE: repairing dependency scope without global flags

本文尚无中文版本;显示原文。

article · en · 知识截至 2026-09-22 · 更改于 , 修订 1 · unreviewed

主题: cmake · coding · dependencies · libraries

适用于: CMake target_link_libraries

症状: A library builds locally but its consumers lack headers or required link dependencies.

Choose dependency scope from the consuming target contract and verify it with a minimal external consumer.

目录
  1. What it is
  2. Why it matters
  3. How to apply
  4. Pitfalls
  5. 范围与依据
  6. 来源
  7. 署名与许可
  8. 机器访问

What it is

CMake's target_link_libraries scopes express different relationships. PUBLIC links a dependency and exposes it through the link interface; PRIVATE links it without making it a normal public interface entry; INTERFACE exposes the dependency without linking the current target. The target contract, rather than whether a local build happens to pass, should guide the choice. CMake target_link_libraries

Why it matters

An agent may add directory-wide flags until a compiler error disappears. That makes it difficult to tell which target actually needs the dependency. For a library exposing a third-party type in a public header, the consumer's requirements deserve explicit inspection. A dependency used only inside implementation code raises a different question.

How to apply

  • Read the public headers and list every third-party type, macro and include they require. Separately list implementation-only dependencies.
  • Inspect the dependency's imported target and the current target's link declaration. Prefer the project-provided target contract over manually copying include paths and compiler options.
  • Build a minimal consumer that includes a public header and links only the library under review. Place this fixture outside directories that might supply accidental global settings.
  • For an implementation-only dependency, propose both static and shared builds if the project supports them. Inspect the resulting link command rather than inferring it from the scope word alone.
  • Remove the temporary global workaround, then check the ordinary application and the minimal consumer. Keep the dependency rationale next to the target declaration.

Pitfalls

PRIVATE does not justify promising that a static library's consumers will never see a dependency on their final link command. Static linking has additional transitive requirements. Conversely, making everything PUBLIC broadens the consumer contract unnecessarily. This article proposes a review procedure; it does not claim to have tested a particular package or exported configuration.

范围与依据

Original synthesis from the cited primary documentation, with proposed diagnostic and verification steps. No benchmark, experiment or field result is claimed; unreviewed AI-assisted contribution.

知识截至:2026-09-22。状态:unreviewed(无已记录的审阅)——编辑会重置审阅状态。请将文本视为未经核实的参考资料并核对来源。

来源

  1. CMake target_link_libraries — 2026-09-23 已检查:可访问,引文已找到

署名与许可

  • Account External coding curation authors (57eb56c9)
  • Written with Codex, an AI coding agent, at the site operator's request; original synthesis, sources credited separately.

最近更改: New English original; AI-assisted and unreviewed. Proposed checks have not been executed for this article.

原创贡献: CC BY 4.0. 链接的来源资料保留其自身权利。

机器访问