In meinem C++/Qt5-Projekt habe ich einige externe Dateien (PNGs usw.), die ich während der Build-Zeit neben der ausführbaren Datei kopiert haben muss. Ich habe bisher keinen guten Weg gefunden, das mit qmake zu realisieren.Qt5 - kopieren Sie zusätzliche Dateien auf Build-Zeit - muss in vielen Situationen funktionieren
Ich habe vor Jahren eine leichtere Variante dieser Frage gestellt, aber alles da und alles, was ich im Internet gefunden habe, erscheint mir unvollständig. Es muss in jedem der folgenden Bedingungen arbeiten:
- Jemand mein Quelltext nimmt und nur Anrufe
qmake foo.pro && make && ./foo
(unter Linux) - Wie oben, aber sie fordert auch
make install
danach - Wie die ersten, aber mit Windows (vergiss Qt DLLs oder andere externe Sachen - ich frage nur nach meinen eigenen Dateien)
- Jemand wählt meinen Quellcode aus, öffnet ihn in QtCreator und klickt einfach auf Play (auf jedem Betriebssystem - aber, ehmm, sagen wir zumindest Linux und Windows)
Alles, was ich gerade habe, ist eher technisch und kaputt. Es muss etwas leichteres und besseres Arbeiten geben als meines.
Dies ist eine abgespeckte Variante, die, was mein foo.pro
tut beschreibt:
QT += core gui xml widgets
TARGET = foo
TEMPLATE = app
...
EXTRA_BINFILES += logo.png
for(FILE, EXTRA_BINFILES) {
extrafiles.commands += $$quote($${QMAKE_COPY} $$shell_path($${PWD}/$${FILE}) $$shell_path($${OUT_PWD})$$escape_expand(\n\t))
}
QMAKE_EXTRA_TARGETS += extrafiles
POST_TARGETDEPS += extrafiles
Es sieht viel komplizierter, dass es mich zu sollen. Es ist in vielerlei Hinsicht gebrochen. Z.B. wenn es in der allerersten Bedingung fehlschlägt (da es versucht, die Datei in sich selbst zu kopieren). Wenn ein Hotfix vorhanden ist, schlägt er unter Windows erneut fehl (ist nicht das eigentliche Ziel, aber OUT_PWD/debug
oder /release
ist). Ich vermute, make install
würde auch nicht funktionieren (aber; ungeprüft).
Bitte helfen;) Muss ich wirklich Korrekturen für all das hinzufügen, oder gibt es einen anderen Ansatz?
Hallo. Ich bin mir nicht 100% sicher, aber für mich sieht es aus wie eine subtil andere Variante von mir, die im Wesentlichen das Gleiche macht. Ist es nicht? Meine aktuelle Lösung verwendet Shell-Befehle (obwohl sie hinter plattformübergreifenden Dingen etwas versteckt sind). Aber das scheint ein wenig zu niedrig zu sein, um alle typischen Situationen elegant abzudecken. – ginger