Y compris dans les répertoires du Clion
Chaque fois que je voulais inclure un répertoire qui était situé à l'extérieur de mon projet avec Clion je voudrais utiliser le -I somedir
drapeau. Cette fois, cependant, ce que je veux faire, c'est d'avoir une hiérarchie comme ceci:
/project
CMakeLists.txt
/src
/Graph
Graph.h
Graph.cpp
/Dijkstra
Dijkstra.h
Dijstra.cpp
Je veux mon code dans une /src
répertoire. Et non seulement cela, mais aussi, par exemple, à l'intérieur du fichier Dijkstra.h
je veux inclure le Graphique.h comme ceci: #include "Graph/Graph.h
et non comme ceci: #include "../Graph/Graph.h
.
Si j'ai seulement ajouter un -I src
drapeau, puis, si je suis à l'intérieur de la Dijkstra.h
fichier et je voulais inclure Graph.h
, je devrais écrire #include "../Graph/Graph.h
, ce qui n'est pas ce que je veux.
J'ai donc essayé d'ajouter aussi de la INCLUDE_DIRECTORIES(src)
. Qui a résolu le problème ci-dessus, cependant lorsque j'essaye de compilé, j'ai eu une erreur liens undefined reference to...
.
Donc j'ai essayé d'ajouter les fichiers un par un, comme ceci:
set(SOURCE_FILES
src/Dijkstra/Dijkstra.h
src/Dijkstra/Dijkstra.cpp
src/Graph/Graph.h
src/Graph/Graph.cpp)
add_executable(someprojectname ${SOURCE_FILES})
et qui ont ramené au problème précédent, où j'ai dû inclure les fichiers comme ceci: #include "../Graph/Graph.h"
.
Comment puis-je faire cela correctement pour obtenir le comportement que je veux ?
Pas question claire. Si vous utilisez la dernière version et ajouter
include_directories(src/Graph src/Dijkstra)
ce qui se passe?La façon dont je l'ai suggéré est le meilleur moyen de prise de structure de répertoire . .rpc dans un répertoire .h fichier dans un autre répertoire. Pourquoi mélanger ces fichiers dans un seul répertoire.
OriginalL'auteur dimitris93 | 2016-04-27
Vous devez vous connecter pour publier un commentaire.
Commande
INCLUDE_DIRECTORIES
ne pas ajouter de tout fichier source pour compiler!Au lieu de cela, cette commande définit les répertoires pour de recherche de fichiers d'en-tête.
Vous devez dresser une liste de tous les source fichiers dans
add_executable()
appel dans tous les cas:OriginalL'auteur Tsyvarev
Mise à JOUR: @Tsyvarev réponse est bonne. J'ai édité cette réponse à supprimer la partie incorrecte et de garder les commentaires relatifs à
target_include_directories()
, mais elle doit être considérée comme complémentaire Tsyvarev de réponse.INCLUDE_DIRECTORIES(src)
fera lesrc
répertoire ajouté comme un chemin de recherche pour toutes les cibles définies à partir de ce point. Il n'est pas ajouter des sources à toutes les cibles. Le chemin de recherche sera par rapport à la source de courant répertoire et CMake va ajuster, le cas échéant, lors de la descente dans les sous-répertoires viaadd_subdirectory()
. Tout cela est bien si c'est ce que vous voulez, tant que le projet est plus grand et plus compliqué, vous pouvez trouver vous préférez appliquer le chemin de l'paramètres de certaines cibles. Pour cela, utilisez de l'target_include_directories()
à la place:Cela aura le même effet, mais il limite l'utilisation de la plus chemin de de juste le
someprojectname
cible. Si plus tard vous souhaitez définir une autre cible qui n'a pas besoin de l'inclure chemin, il ne sera pas ajouté. Cela peut aider à prévenir de telles situations inattendues fichiers d'être pris si vous avez la profondeur des hiérarchies de répertoires et de vous ré-utiliser des noms de répertoire dans des endroits différents, par exemple).La
target_include_directories()
de commande possède des avantages supplémentaires lorsqu'il est appliqué à la bibliothèque cibles parce que CMake a la capacité d'effectuer le chemin à travers tout ce que vous lier avec la bibliothèque. Ne pas sembler beaucoup, mais pour les grands projets qui les définissent et les relier de nombreuses bibliothèques, il peut être d'une grande aide. Il y a d'autres spécifiques à la cible des commandes qui ont les mêmes avantages. Cet article peut vous donner un peu une idée de ce qui est possible (disclaimer: j'ai écrit l'article). Il est plus axé surtarget_sources()
, mais la discussion autour de la réalisation des dépendances vers d'autres cibles peuvent être utiles.include_directories()
automatiquement transforme tous les chemins d'accès relatifs à l'absolu. Voir documentation pour plus de détails.En effet, vous avez raison! Et j'ai mal compris la question (raté où include_directories() a été utilisé). Je vais laisser ma réponse ici pour un certain temps pour permettre à ceux qui ont déjà lu, c'est pour voir ma correction, alors je vais supprimer ma réponse. Merci pour la correction!
OriginalL'auteur Craig Scott