2016-04-27 18 views
5

Immer wenn ich ein Verzeichnis, das außerhalb von meinem Projekt mit Clion befand, wollte ich das -I somedir Flag verwenden. Dieses Mal jedoch, was ich tun möchte, ist eine Hierarchie wie diese hat:Einschließlich Verzeichnisse in Clion

/project 
    CMakeLists.txt 
    /src 
     /Graph 
     Graph.h 
     Graph.cpp 
     /Dijkstra 
     Dijkstra.h 
     Dijstra.cpp 

ich meinen Code will in einem /src Verzeichnis. Und nicht nur das, sondern auch, zum Beispiel, in der Datei Dijkstra.h möchte ich die Graph.h wie folgt einfügen: #include "Graph/Graph.h und nicht wie folgt: #include "../Graph/Graph.h.

Wenn ich nur einen -I src Flag hinzuzufügen, dann, wenn ich in der Dijkstra.h Datei bin und ich wollte Graph.h aufzunehmen, würde ich #include "../Graph/Graph.h schreiben muß, was nicht das, was ich will.

Also habe ich versucht, auch INCLUDE_DIRECTORIES(src) hinzuzufügen. Das hat das Problem oben behoben, aber als ich versucht habe zu kompilieren, habe ich einen Linkerfehler undefined reference to....

Also habe ich versucht, die Dateien nacheinander wie folgt ergänzt:

set(SOURCE_FILES 
     src/Dijkstra/Dijkstra.h 
     src/Dijkstra/Dijkstra.cpp 
     src/Graph/Graph.h 
     src/Graph/Graph.cpp) 
add_executable(someprojectname ${SOURCE_FILES}) 

und dass das bisherige Problem zurückgebracht, wo ich die Dateien wie diese gehören musste: #include "../Graph/Graph.h".

Wie kann ich das richtig machen, um das gewünschte Verhalten zu erhalten?

+0

würde ich vorschlagen, Sie Verzeichnisstruktur wie dieser Graph/src/* verwenden cav, Grafik/include/* .h, Dijkstra/src/* .cpp und Dijkstra/include/*. h .. Dann versuchen SET (GRAPH_INCLUDE_DIR Graph/include /), SET (DIJKSTRA_INCLUDE_DIR Dijkstra/include /) INCLUDE_DIRECTORIES ($ {GRAPH_INCLUDE_DIR} $ {DIJKSTRA_INCLUDE_DIR}) – Varun

+0

Keine klare Frage überhaupt. Wenn Sie die letzte Variante verwenden und 'include_directories (src/Graph src/Dijkstra) hinzufügen, was passiert? – fghj

+0

Die Art und Weise, die ich vorgeschlagen habe, ist eine bessere Möglichkeit, Verzeichnisstruktur zu erstellen. .cpp in einem Verzeichnis und .h-Datei in einem anderen Verzeichnis. Warum diese Dateien in einem einzelnen Verzeichnis mischen. – Varun

Antwort

5

Befehl INCLUDE_DIRECTORIESfügt keine jede Quelldatei für Kompilierung!

Stattdessen definiert dieser Befehl Verzeichnisse für Suche Header-Dateien.

Sie müssen alle Quelle Dateien in add_executable() Anruf in jedem Fall zur Liste:.

include_directories(src) 
set(SOURCE_FILES 
    src/Dijkstra/Dijkstra.cpp 
    src/Graph/Graph.cpp) 
add_executable(someprojectname ${SOURCE_FILES}) 
2

UPDATE: @ Tsyvarevs Antwort ist korrekt. Ich habe diese Antwort bearbeitet, um den falschen Teil zu entfernen und die Kommentare bezüglich target_include_directories() zu behalten, aber es sollte als zu Tsyvarevs Antwort zusätzlich betrachtet werden.

INCLUDE_DIRECTORIES(src) wird das Verzeichnis src als Suchpfad zu allen Zielen hinzugefügt, die von diesem Zeitpunkt an definiert sind. Es fügt keine Quellen zu Zielen hinzu. Der Suchpfad wird relativ zum aktuellen Quellverzeichnis sein und CMake passt es beim Abstieg in Unterverzeichnisse über add_subdirectory() entsprechend an. Während dies in Ordnung ist, wenn Sie das möchten, wird das Projekt, je größer und komplizierter das Projekt wird, möglicherweise bevorzugen, die Einstellungen für den Include-Pfad nur auf einige Ziele anzuwenden. Dafür verwenden target_include_directories() statt:

target_include_directories(someprojectname "${CMAKE_CURRENT_SOURCE_DIR}/src") 

Dies wird die gleiche Wirkung haben, aber es schränkt die Verwendung der zusätzlichen Suchpfad nur das someprojectname Ziel. Wenn Sie später ein anderes Ziel definieren, das den Include-Pfad nicht benötigt, wird es nicht hinzugefügt. Dies kann verhindern, dass unerwartete Dateien aufgenommen werden, wenn Sie z. B. tiefe Verzeichnishierarchien haben und Verzeichnisnamen an verschiedenen Stellen wiederverwenden.

Der Befehl target_include_directories() hat zusätzliche Vorteile, wenn er auf Bibliotheksziele angewendet wird, da CMake die Fähigkeit besitzt, den Include-Pfad auch zu allem weiterzuleiten, das Sie mit dieser Bibliothek verknüpfen. Klingt nicht nach viel, aber für große Projekte, die viele Bibliotheken definieren und verknüpfen, kann es eine große Hilfe sein. Es gibt andere zielspezifische Befehle, die ähnliche Vorteile haben. This article kann Ihnen ein bisschen ein Gefühl für das geben, was möglich ist (Disclaimer: Ich schrieb den Artikel). Es konzentriert sich mehr auf target_sources(), aber die Diskussion um die Übertragung von Abhängigkeiten zu anderen Zielen kann nützlich sein.

+0

'include_directories()' ** ** ** verwandelt automatisch alle relativen Pfade in absolute. Weitere Informationen finden Sie unter [Dokumentation] (https://cmake.org/cmake/help/v3.0/command/include_directories.html). – Tsyvarev

+0

Tatsächlich sind Sie richtig! Und ich habe die Frage missverstanden (verpasst wo include_directories() benutzt wurde). Ich werde meine Antwort hier für eine Weile lassen, damit diejenigen, die sie bereits gelesen haben, meine Korrektur sehen können, dann lösche ich meine Antwort. Danke für die Korrektur! –