2016-07-07 2 views
3

Dans mon projet C++/Qt5, j'ai des fichiers externes (PNG etc.) que j'ai besoin d'avoir copiés à côté de l'exécutable lors de la compilation. Je n'ai trouvé aucun moyen de le réaliser avec qmake.Qt5 - copie de fichiers supplémentaires en temps de construction - doit fonctionner dans plusieurs situations

J'ai demandé une variante plus légère de cette question il y a quelques années, mais tout ce que j'ai trouvé sur Internet me semble incomplet. Il doit travailler dans chacune des conditions suivantes:

  • Quelqu'un ramasse mon code source et appelle simplement qmake foo.pro && make && ./foo (sous Linux)
  • Comme ci-dessus, mais elle appelle aussi make install après
  • Comme le premier, mais avec Windows (oubliez les DLL Qt ou autres trucs externes - je demande à peu près mes propres fichiers)
  • Quelqu'un choisit mon code source, l'ouvre dans QtCreator et clique simplement sur Play (sur n'importe quel système d'exploitation - mais, ehmm, disons au moins Linux et Windows)

Tout ce que j'ai actuellement est plutôt technique et cassé aussi bien. Il doit y avoir quelque chose de plus léger et de mieux travailler que le mien?

C'est une variante dépouillée qui décrit ce que mon foo.pro fait:

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 

Il semble beaucoup plus compliqué qu'il me doit à. Il est cassé à bien des égards. Par exemple. si échoue dans la toute première condition (puisqu'il essaie de copier le fichier sur lui-même). Avec un correctif en place, il échoue à nouveau sur Windows (puisque OUT_PWD n'est pas la cible réelle, mais OUT_PWD/debug ou /release est). Je soupçonne que make install ne fonctionnerait pas non plus (mais pas testé).

S'il vous plaît aider;) Dois-je vraiment ajouter des correctifs pour tout cela, ou y a-t-il une approche différente?

Répondre

0

Utilisation de scripts shell/qmake avant la construction commence dans votre fichier PRO:

QMAKE_PRE_LINK += someShellCommand $$system_quote($$shell_quote(somePath)) $$escape_expand(\\n\\t)

Par exemple,

win32 { 
QMAKE_PRE_LINK += copy /Y $$system_quote($$shell_quote($${PWD}/../../images/*.png)) $$system_quote($$shell_quote($${PWD}/../build/Output/release/resources)) $$escape_expand(\\n\\t) 
} 


linux { 
QMAKE_PRE_LINK += cp -r -t -f $$system_quote($$shell_quote($${PWD}/../../images/*.png)) $$system_quote($$shell_quote($${PWD}/../build/Output/release/resources)) $$escape_expand(\\n\\t) 
} 

Utilisation de scripts shell/qmake à la fin build-temps dans votre PRO fichier:

QMAKE_POST_LINK += someShellCommand $$system_quote($$shell_quote(somePath)) $$escape_expand(\\n\\t)

+0

Hi. Je ne suis pas sûr à 100%, mais pour moi, il ressemble à une variante subtilement différente de la mienne, qui fait essentiellement la même chose. N'est-ce pas? Ma solution actuelle utilise des commandes de shell (bien qu'elles soient quelque peu conçues derrière des éléments multi-plateformes). Mais cela semble un peu trop bas pour couvrir élégamment toutes les situations typiques. – ginger