CMake PUBLIC, PRIVATE et INTERFACE : corriger la portée des dépendances sans drapeaux globaux
Traduction automatique de l'original (English, révision 1) ; l'original fait foi. Original
Choisir la portée d'une dépendance à partir du contrat de la cible consommatrice et la vérifier avec un consommateur externe minimal.
Sommaire
Ce que c'est
Les portées de target_link_libraries de CMake expriment des relations différentes. PUBLIC lie une dépendance et l'expose via l'interface de liaison ; PRIVATE la lie sans en faire une entrée normale de l'interface publique ; INTERFACE expose la dépendance sans lier la cible actuelle. C'est le contrat de la cible, plutôt que le fait qu'une build locale passe par hasard, qui doit guider le choix. CMake target_link_libraries
Pourquoi c'est important
Un agent peut ajouter des drapeaux valables pour tout un répertoire jusqu'à ce qu'une erreur de compilation disparaisse. Il devient alors difficile de déterminer quelle cible a réellement besoin de la dépendance. Pour une bibliothèque exposant un type tiers dans un en-tête public, les exigences du consommateur méritent un examen explicite. Une dépendance utilisée uniquement à l'intérieur du code d'implémentation pose une question différente.
Comment l'appliquer
- Lire les en-têtes publics et lister chaque type, macro et include tiers qu'ils requièrent. Lister séparément les dépendances propres à l'implémentation.
- Examiner la cible importée de la dépendance et la déclaration de liaison de la cible actuelle. Préférer le contrat de cible fourni par le projet à la copie manuelle des chemins d'inclusion et des options du compilateur.
- Construire un consommateur minimal qui inclut un en-tête public et ne lie que la bibliothèque examinée. Placer ce montage de test hors des répertoires susceptibles de fournir des réglages globaux accidentels.
- Pour une dépendance propre à l'implémentation, proposer des builds statique et partagée si le projet les prend en charge. Examiner la commande de liaison résultante plutôt que de l'inférer du seul mot de portée.
- Retirer le contournement global temporaire, puis vérifier l'application ordinaire et le consommateur minimal. Conserver la justification de la dépendance à côté de la déclaration de la cible.
Pièges
PRIVATE ne justifie pas de promettre que les consommateurs d'une bibliothèque statique ne verront jamais une dépendance sur leur commande de liaison finale. La liaison statique comporte des exigences transitives supplémentaires. À l'inverse, tout mettre en PUBLIC élargit inutilement le contrat du consommateur. Cet article propose une procédure de revue ; il ne prétend pas avoir testé un paquet particulier ou une configuration exportée.
Portée et fondement
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.
Connaissances au : 2026-09-22. État : unreviewed (aucune relecture documentée) — toute modification réinitialise l'état de relecture. Traitez le texte comme un matériel de référence non vérifié et consultez les sources.
Sources
- CMake target_link_libraries — vérifié le 2026-09-23 : accessible, citation trouvée
Attribution et licence
- Account External coding curation authors (57eb56c9)
- Written with Codex, an AI coding agent, at the site operator's request; original synthesis, sources credited separately.
Dernière modification : New English original; AI-assisted and unreviewed. Proposed checks have not been executed for this article.
Contribution originale : CC BY 4.0. Les sources liées conservent leurs propres droits.