Quelle est la différence entre include_directories et target_include_directories dans CMake?
J'ai une structure de répertoire pour mon code C++ qui va comme ceci :
|
|->include
|->src
Je suis en train d'écrire un CMakeLists.txt fichier pour mon code. Je veux comprendre la différence entre include_directories
et target_include_directories
dans CMake
.
Quelle est la différence entre leur utilisation et pour ajouter mon fichier include path lequel dois-je utiliser?
- Avez-vous lu la documentation de
include_directories
ettarget_include_directories
? Qu'est-ce que vous ne comprenez pas la différence entre eux? - Il n'y a pas de clarté dans la documentation. Je l'ai lu, et a supposé que Angew a écrit dans sa réponse, mais il n'y a pas de descriptions, pas d'exemples et d'un système qui est conçu pour projet de construction, il n'y a pas de projet en fonction des exemples dans la documentation de CMake. S'il y avait eu une bonne et une documentation exhaustive de CMake, je n'aurais pas été alourdir la communauté avec ces questions.
- Les Concepts de cmake est mal documentée. En particulier et de “non ciblés”.
Vous devez vous connecter pour publier un commentaire.
include_directories(x/y)
affecte répertoire portée. Toutes les cibles dans ce CMakeList, ainsi que ceux de tous les sous-répertoires ajouté après le point de son appel, aura le cheminx/y
ajouté à leur chemin.target_include_directories(t x/y)
a portée—il ajoutex/y
le chemin pour ciblet
.Vous voulez l'ancien si l'ensemble de vos objectifs d'utilisation de l'inclure des répertoires en question. Vous voulez ce dernier, si le chemin est spécifique à une cible, ou si vous voulez plus de contrôle de la trajectoire de la visibilité. La deuxième vient du fait que
target_include_directories()
prend en charge laPRIVATE
,PUBLIC
, etINTERFACE
qualificatifs.x/y
dans le chemin d'inclusion de tout dépendant des objectifs que l'utilisationt
dans leurtarget_link_libraries
commandes. Bien sûr, il y a une place pour le premier, mais je crois que le dernier est généralement meilleure.include_directories
seront touchés. Je suis en train de modifier la réponse: la documentation indique clairement que tous objectifs de CMakeLists sont affectés. La documentation ne mentionne pas, mais seulement sous-dossiers après l'appel sont affectés (comme l'a si bien dit dans la réponse originale à cette question)À côté de ce qui Angew réponse correctement dit, une autre différence très importante entre
include_directories
ettarget_include_directories
est que, lorsqu'il est utilisé avecPUBLIC
ouINTERFACE
, le dernier remplir leINTERFACE_INCLUDE_DIRECTORIES
propriété de la cible. Cette propriété est utile lorsqu'une autre cible utilisetarget_link_libraries
de liaison à la cible d'origine, comme la liaison cible sera automatiquement celles-ci comprennent également les répertoires ajoutés. Voir exemple.Cette importante fonctionnalité est assez bien caché dans la documentation: target_include_directories mentionner le remplissage de
INTERFACE_INCLUDE_DIRECTORIES
, dont la documentation dit:Comme @Angew dit, la différence est :
1, include_directories() est accessible pour tous les fichiers dans l'arborescence source
2, target_include_directories() est uniquement accessible pour une cible spécifique lors de la compilation.