Irgendwie bin ich total verwirrt darüber, wie CMake funktioniert. Jedes Mal, wenn ich denke, dass ich näher komme, um zu verstehen, wie CMake geschrieben werden soll, verschwindet es im nächsten Beispiel, das ich lese. Ich möchte nur wissen, wie ich mein Projekt strukturieren soll, damit mein CMake in Zukunft am wenigsten gewartet werden muss. Zum Beispiel möchte ich meine CMakeList.txt nicht aktualisieren, wenn ich einen neuen Ordner in meinem src-Baum hinzufüge, der genau wie alle anderen src-Ordner funktioniert.
So stelle ich mir die Struktur meines Projekts vor, aber bitte, dies ist nur ein Beispiel. Wenn der empfohlene Weg unterschiedlich ist, sagen Sie es mir bitte und wie es geht.
myProject
src/
module1/
module1.h
module1.cpp
module2/
[...]
main.cpp
test/
test1.cpp
resources/
file.png
bin
[execute cmake ..]
Übrigens ist es wichtig, dass mein Programm weiß, wo sich die Ressourcen befinden. Ich würde gerne wissen, wie Ressourcen empfohlen werden. Ich möchte nicht mit "../resources/file.png" auf meine Ressourcen zugreifen.
quelle
For example I don't want to update my CMakeList.txt when I am adding a new folder in my src tree
Können Sie ein Beispiel für eine IDE geben, die automatisch Quellen sammelt?Antworten:
Nach einigen Recherchen habe ich jetzt meine eigene Version des einfachsten, aber vollständigsten cmake-Beispiels. Hier ist es, und es wird versucht, die meisten Grundlagen, einschließlich Ressourcen und Verpackung, abzudecken.
Eine Sache, die nicht dem Standard entspricht, ist das Ressourcenhandling. Standardmäßig möchte cmake sie in / usr / share /, / usr / local / share / und etwas Äquivalentes unter Windows ablegen. Ich wollte ein einfaches zip / tar.gz haben, das Sie überall extrahieren und ausführen können. Daher werden Ressourcen relativ zur ausführbaren Datei geladen.
Die Grundregel zum Verständnis von cmake-Befehlen lautet wie folgt:
<function-name>(<arg1> [<arg2> ...])
ohne Komma oder Halbfarbe. Jedes Argument ist eine Zeichenfolge.foobar(3.0)
undfoobar("3.0")
ist das gleiche. Sie können Listen / Variablen mit einstellenset(args arg1 arg2)
. Mit dieser Variablen gesetztfoobar(${args})
undfoobar(arg1 arg2)
sind praktisch gleich. Eine nicht vorhandene Variable entspricht einer leeren Liste. Eine Liste ist intern nur eine Zeichenfolge mit Semikolons, um die Elemente zu trennen. Daher ist eine Liste mit nur einem Element per Definition nur dieses Element, es findet kein Boxen statt. Variablen sind global. Eingebaute Funktionen bieten eine Form von benannten Argumenten , da sie einige IDs wie oder erwarten in ihrer Argumentliste, um die Argumente zu gruppieren. Dies ist jedoch keine Sprachfunktion. Diese IDs sind auch nur Zeichenfolgen und werden von der Funktionsimplementierung analysiert.PUBLIC
DESTINATION
Sie können alles von Github klonen
quelle
set(sources src/main.cpp)
.CMakeLists.txt
Verzeichnis einfügen, löst ein normales make (oder ein Ninja) den erneuten Aufruf von cmake aus, sodass Sie es nicht vergessen können. Es ist auch ein bisschen teamfreundlicher, denn dann können die Teammitglieder auch nicht vergessen, cmake auszuführen. Aber ich denke, ein Makefile sollte nicht berührt werden müssen, nur weil jemand eine Datei hinzugefügt hat. Schreiben Sie es einmal, und niemand sollte jemals wieder darüber nachdenken müssen.Das grundlegendste, aber vollständigste Beispiel finden Sie im CMake-Tutorial :
Für Ihr Projektbeispiel haben Sie möglicherweise:
Für Ihre zusätzliche Frage gibt es im Tutorial noch einen Weg: Erstellen Sie eine konfigurierbare Header-Datei, die Sie in Ihren Code aufnehmen. Erstellen Sie dazu eine Datei
configuration.h.in
mit folgendem Inhalt:Dann in deinem
CMakeLists.txt
fügen hinzu:Wenn Sie den Pfad in Ihrem Code benötigen, können Sie Folgendes tun:
quelle
string resourcePath = string(RESOURCE_PATH) + "file.png"
IMHO ist es eine schlechte Idee, den absoluten Pfad zum Quellverzeichnis fest zu codieren . Was ist, wenn Sie Ihr Projekt installieren müssen?Hier schreibe ich ein sehr einfaches, aber vollständiges Beispiel für CMakeLists.txt-Dateien.
Quellcode
Danach bot ich ein Dokument für die Details an.
Wenn Sie Fragen haben, können Sie mich kontaktieren und ich würde es gerne erklären.
quelle