J'ai une structure de répertoire 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 include, lequel dois-je utiliser?
include_directories(x/y)
affecte la portée du répertoire. Le chemin x/y
sera ajouté à leur chemin d'inclusion pour toutes les cibles de cette liste CMakeList, ainsi que pour celles de tous les sous-répertoires ajoutés après le point d'appel.
target_include_directories(t x/y)
a la portée de la cible - il ajoute x/y
au chemin d'inclusion de la cible t
.
Vous voulez l'ancien si toutes vos cibles utilisent les répertoires d'inclusion en question. Vous voulez le dernier si le chemin est spécifique à une cible ou si vous voulez un contrôle plus fin de la visibilité du chemin. Cette dernière provient du fait que target_include_directories()
prend en charge les qualificateurs PRIVATE
, PUBLIC
et INTERFACE
.
A côté de ce que la réponse d'Angew dit correctement, une autre différence très importante entre include_directories
et target_include_directories
est que, lorsqu'il est utilisé avec PUBLIC
ou INTERFACE
, ce dernier remplit la propriété INTERFACE_INCLUDE_DIRECTORIES
de la cible. Cette propriété est utile lorsqu'une autre cible utilise target_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 mention remplissant INTERFACE_INCLUDE_DIRECTORIES
, dont documentation dit:
Lorsque les dépendances de la cible sont spécifiées avec target_link_libraries () , CMake lira cette propriété de toutes les dépendances cibles vers déterminer les propriétés de construction du consommateur.
Comme @Angew l'a dit, la différence est la suivante:
1, include_directories () est accessible pour tous les fichiers de l'arborescence source 2, target_include_directories () n'est accessible que pour une cible spécifique lors de la compilation.