Vor ungefähr einem Jahr habe ich nach Header-Abhängigkeiten in CMake gefragt .
Ich habe kürzlich festgestellt, dass das Problem darin zu bestehen schien, dass CMake diese Header-Dateien als außerhalb des Projekts liegend ansah . Zumindest beim Generieren eines Code :: Blocks-Projekts werden die Header-Dateien nicht im Projekt angezeigt (die Quelldateien). Es scheint mir daher, dass CMake diese Header als außerhalb des Projekts liegend betrachtet und sie nicht in den Abhängigkeiten verfolgt.
Eine schnelle Suche im CMake-Tutorial zeigte nur, include_directories
was nicht zu tun scheint, was ich wünsche ...
Was ist der richtige Weg, um CMake zu signalisieren, dass ein bestimmtes Verzeichnis zu enthaltende Header enthält und dass diese Header vom generierten Makefile verfolgt werden sollten?
.cbp
Projektdatei bezogen. Wenn der cmake-Abhängigkeitsscanner eine Header-Datei nicht korrekt als Abhängigkeit für ein Makefile identifiziert, gibt es Möglichkeiten, dies zu beheben. In einigen Fällen wird dies jedoch falsch sein, da kein vollständiger Präprozessor enthalten ist.Antworten:
Zwei Dinge müssen getan werden.
Fügen Sie zuerst das Verzeichnis hinzu, das aufgenommen werden soll:
Wenn Sie mit einer sehr alten CMake-Version (2.8.10 oder älter) ohne Unterstützung nicht weiterkommen
target_include_directories
, können Sieinclude_directories
stattdessen auch das Legacy verwenden:Dann müssen Sie auch die Header-Dateien zur Liste Ihrer Quelldateien für das aktuelle Ziel hinzufügen, zum Beispiel:
Auf diese Weise werden die Header-Dateien als Abhängigkeiten im Makefile und beispielsweise auch im generierten Visual Studio-Projekt angezeigt, sofern Sie eines generieren.
So verwenden Sie diese Header-Dateien für mehrere Ziele:
quelle
LIBROOT_HEADER_FILES
Variable inliba/CMakefile
undlibb/CMakefile
dann verwenden?include_directories
übertarget_include_directories
. Ersteres legt es rekursiv für alle Ziele in diesem Verzeichnis fest. während letzteres es für ein Ziel setzt. Wenn Sie erstere ausführen, wird der Begriff eines Zieldiagramms in CMake gebrochen und stattdessen auf Nebenwirkungen Ihrer Dateihierarchie zurückgegriffen.target_include_directories
modernen CMake-Code zu bevorzugen . Sie können mich gerne zu einem Chat einladen, wenn Sie mit den Änderungen nicht einverstanden sind.Zunächst
include_directories()
weisen Sie CMake an, das Verzeichnis-I
zur Kompilierungsbefehlszeile hinzuzufügen . Zweitens listen Sie die Header in Ihremadd_executable()
oderadd_library()
Anruf auf.Wenn sich beispielsweise die Quellen Ihres Projekts in befinden
src
und Sie Header von benötigeninclude
, können Sie dies folgendermaßen tun:quelle
add_executable
? Ich dachte, CMake hat die Abhängigkeiten der Include-Dateien automatisch herausgefunden.CMake ähnelt eher einer Skriptsprache, wenn es mit anderen Methoden zum Erstellen von Makefile (z. B. make oder qmake) verglichen wird. Es ist nicht sehr cool wie Python, aber trotzdem.
Es gibt keinen " richtigen Weg ", wenn man in verschiedenen OpenSource-Projekten nachschaut, wie Leute Verzeichnisse einbinden. Es gibt jedoch zwei Möglichkeiten.
Crude include_directories hängt ein Verzeichnis an das aktuelle Projekt und alle anderen untergeordneten Projekte an, die Sie über eine Reihe von Befehlen add_subdirectory anhängen . Manchmal sagen die Leute, dass ein solcher Ansatz ein Vermächtnis ist.
Ein eleganterer Weg ist mit target_include_directories . Es ermöglicht das Anhängen eines Verzeichnisses für ein bestimmtes Projekt / Ziel ohne (möglicherweise) unnötige Vererbung oder Kollision verschiedener Include-Verzeichnisse. Ermöglichen Sie auch das Durchführen einer subtilen Konfiguration und das Anhängen einer der folgenden Markierungen für diesen Befehl.
PRIVATE - Nur für dieses angegebene Build-Ziel verwenden
PUBLIC - Verwenden Sie es für ein bestimmtes Ziel und für Ziele, die mit diesem Projekt verknüpft sind
SCHNITTSTELLE - Verwenden Sie diese Option nur für Ziele, die mit dem aktuellen Projekt verknüpft sind
PS:
Mit beiden Befehlen können Sie ein Verzeichnis als SYSTEM markieren, um einen Hinweis darauf zu geben, dass die angegebenen Verzeichnisse keine Warnungen enthalten.
Eine ähnliche Antwort gibt es mit anderen Befehlspaaren target_compile_definitions / add_definitions , target_compile_options / CMAKE_C_FLAGS
quelle
Hinzufügen
include_directories("/your/path/here")
.Dies ähnelt dem Aufruf
gcc
mit-I/your/path/here/
Option.Stellen Sie sicher, dass Sie den Pfad in doppelte Anführungszeichen setzen. Andere Leute haben das nicht erwähnt und es hat mich 2 Tage lang festgefahren. Diese Antwort ist also für Leute, die CMake noch sehr neu und sehr verwirrt sind.
quelle
Ich hatte das gleiche Problem.
Mein Projektverzeichnis war wie folgt:
Und was ich verwendet habe, um die Dateien in all diese Ordner aufzunehmen:
Und es hat total funktioniert.
quelle