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. リンク先の出典はそれぞれの権利を保持します。

機械アクセス