Ich versuche ein einfaches Projekt auf CLion zu erstellen. Es verwendet CMake (ich bin neu hier), um Makefiles zu generieren, um ein Projekt (oder eine Art davon) zu erstellen.
Alles, was ich tun muss, ist, jedes Mal, wenn ich meinen Code ausführe, eine Nicht-Projektdatei (eine Art Ressourcendatei) in ein Binärverzeichnis zu übertragen.
Diese Datei enthält Testdaten und wird von der Anwendung geöffnet, um sie zu lesen. Ich habe verschiedene Möglichkeiten ausprobiert:
Über
file(COPY ...
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/input.txt DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/input.txt
Sieht gut aus, funktioniert aber nur einmal und kopiert die Datei nach dem nächsten Lauf nicht erneut.
Über
add_custom_command
OUTPUT
Ausführungadd_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/input.txt COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/input.txt ${CMAKE_CURRENT_BINARY_DIR}/input.txt)
TARGET
Ausführungadd_custom_target(foo) add_custom_command( TARGET foo COMMAND ${CMAKE_COMMAND} copy ${CMAKE_CURRENT_BINARY_DIR}/test/input.txt ${CMAKE_SOURCE_DIR})
Aber niemand davon funktioniert.
Was mache ich falsch?
configure_file
mit Unterverzeichnissen nicht funktioniert, selbst wenn Sie GLOB zum Erstellen einer Liste von Dateien verwenden.Beide Optionen sind gültig und zielen auf zwei verschiedene Schritte Ihres Builds ab:
file(COPY ...
kopiert die Datei im Konfigurationsschritt und nur in diesem Schritt. Wenn Sie Ihr Projekt neu erstellen, ohne Ihre cmake-Konfiguration geändert zu haben, wird dieser Befehl nicht ausgeführt.add_custom_command
ist die bevorzugte Wahl, wenn Sie die Datei bei jedem Erstellungsschritt kopieren möchten.Die richtige Version für Ihre Aufgabe wäre:
Sie können wählen zwischen
PRE_BUILD
,PRE_LINK
amPOST_BUILD
besten lesen Sie die Dokumentation von add_custom_commandEin Beispiel zur Verwendung der ersten Version finden Sie hier: Verwenden Sie CMake add_custom_command, um eine Quelle für ein anderes Ziel zu generieren
quelle
CMAKE_CURRENT_SOURCE_DIR
wenn dietest/input.txt
Datei relativ zur aktuellenCMakeLists.txt
Datei ist. Wenn es relativ zur Wurzel istCMakeLists.txt
, verwenden SieCMAKE_SOURCE_DIR
.Die erste Option, die Sie ausprobiert haben, funktioniert aus zwei Gründen nicht.
Zuerst haben Sie vergessen, die Klammer zu schließen.
Zweitens
DESTINATION
sollte das ein Verzeichnis sein, kein Dateiname. Angenommen, Sie haben die Klammer geschlossen, wird die Datei in einem Ordner namens aufgerufeninput.txt
.Damit es funktioniert, ändern Sie es einfach in
quelle
Ich würde vorschlagen,
TARGET_FILE_DIR
wenn Sie möchten, dass die Datei in denselben Ordner wie Ihre EXE-Datei kopiert wird.In VS kopiert dieses cmake-Skript input.txt in dieselbe Datei wie Ihre endgültige Exe, unabhängig davon, ob es sich um ein Debug oder eine Version handelt.
quelle
Dies ist, was ich verwendet habe, um einige Ressourcendateien zu kopieren: Die Kopierdateien sind ein leeres Ziel, um Fehler zu ignorieren
quelle
add_dependencies(MainTarget copy-files)
, damit es automatisch ausgeführt wird, wenn ich MainTargetadd_dependencies(MainTarget copy-files)
der StammdateiCMakeLists.txt
kann diese im gesamten Projekt verwendet werden.Wenn Sie den Ordner aus dem Johannisbeerverzeichnis in den Binärordner (Build-Ordner) kopieren möchten
dann ist die syntexe:
quelle
Die vorgeschlagene configure_file ist wahrscheinlich die einfachste Lösung. Der Kopierbefehl wird jedoch nicht erneut ausgeführt, wenn Sie die Datei manuell aus dem Erstellungsverzeichnis gelöscht haben. Um auch diesen Fall zu behandeln, funktioniert Folgendes für mich:
quelle