web-dev-qa-db-fra.com

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

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?

76
Ujjwal Aryan

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.

86
Angew

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.

27
Antonio

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. 

0
Nick.Rhan