J'ai une structure de répertoires pour mon code C ++ qui va comme ceci:
|
|->include
|->src
J'écris un fichier CMakeLists.txt 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 chemin de fichier d'inclusion, lequel dois-je utiliser?
include_directories
ettarget_include_directories
? Qu'est-ce que vous ne comprenez pas à la différence entre eux?Réponses:
include_directories(x/y)
affecte la portée du répertoire. Toutes les cibles de cette CMakeList, ainsi que celles de tous les sous-répertoires ajoutés après le point de son appel, auront le cheminx/y
ajouté à leur chemin d'inclusion.target_include_directories(t x/y)
a une portée cible - il ajoutex/y
au chemin d'inclusion de la ciblet
.Vous voulez l'ancien si toutes vos cibles utilisent les répertoires d'inclusion en question. Vous voulez ce dernier si le chemin est spécifique à une cible, ou si vous voulez un contrôle plus fin de la visibilité du chemin. Ce dernier provient du fait que
target_include_directories()
soutient lesPRIVATE
,PUBLIC
etINTERFACE
qualificatifs.la source
x/y
dans le chemin d'inclusion de toutes les cibles dépendantes qui utilisentt
dans leurstarget_link_libraries
commandes. Bien sûr, il y a une place pour le premier, mais je pense que le second est généralement meilleur.include_directories
seront affectés. Je modifie la réponse: la documentation indique clairement que toutes les cibles des CMakeLists actuelles sont affectées. La documentation ne mentionne pas mais seuls les sous-répertoires après l'appel sont affectés (comme cela a été correctement indiqué dans la réponse d'origine)target_include_directories
a été introduit dans CMake 2.8.11 (mai 2013)Outre ce que dit correctement la réponse d'Angew , une autre différence très importante entre
include_directories
ettarget_include_directories
est que, lorsqu'il est utilisé avecPUBLIC
ouINTERFACE
, ce dernier remplit laINTERFACE_INCLUDE_DIRECTORIES
propriété de la cible. Cette propriété est utile lorsqu'une autre cible utilisetarget_link_libraries
pour se lier à la cible d'origine, car la cible de liaison aura automatiquement ces répertoires d'inclusion ajoutés. Voir exemple .Cette fonctionnalité importante est assez bien cachée dans la documentation: target_include_directories mentionne le remplissage
INTERFACE_INCLUDE_DIRECTORIES
, dont la documentation dit:la source
PUBLIC
propriétés, etc. Merci: DComme l'a dit @Angew, la différence même est:
1, include_directories () est accessible pour tous les fichiers de l'arborescence des sources 2, target_include_directories () n'est accessible que pour une cible spécifique lors de la compilation.
la source