2014-06-29 17 views
6

Zajmuję się tworzeniem aplikacji, która powinna bazować na systemach Windows, Linux i OS X przy użyciu QtCreatora i Qt 5.3. Chcę skopiować wszystkie pliki i podfoldery z folderu do folderu wyjściowego. Mam go działa na Linux i OS X, ale nie dla Windows. Oto odpowiednia sekcja mojego pliku .pro:Polecenie qmake do kopiowania plików i folderów do katalogu wyjściowego

win32 { 
    PWD_WIN = $${PWD} 
    DESTDIR_WIN = $${OUT_PWD} 
    copyfiles.commands = $$quote(cmd /c xcopy /S /I $${PWD_WIN}\copy_to_output $${DESTDIR_WIN}) 
} 
macx { 
    copyfiles.commands = cp -r $$PWD/copy_to_output/* $$OUT_PWD 
} 
linux { 
    copyfiles.commands = cp -r $$PWD/copy_to_output/* $$OUT_PWD 
} 
QMAKE_EXTRA_TARGETS += copyfiles 
POST_TARGETDEPS += copyfiles 

Błąd wyświetlany w systemie Windows to "Nieprawidłowa liczba parametrów".

Odpowiedz

10

Jeśli spojrzysz na zmienną $${PWD} z message($${PWD}), zobaczysz / jako seperator katalogu, nawet w systemie Windows. Trzeba przekonwertować go do rodzimej separatora katalogu:

PWD_WIN = $${PWD} 
DESTDIR_WIN = $${OUT_PWD} 
PWD_WIN ~= s,/,\\,g 
DESTDIR_WIN ~= s,/,\\,g 

copyfiles.commands = $$quote(cmd /c xcopy /S /I $${PWD_WIN}\\copy_to_output $${DESTDIR_WIN}) 

QMAKE_EXTRA_TARGETS += copyfiles 
POST_TARGETDEPS += copyfiles 
+1

Jeśli chcesz zrobić to za każdym razem, trzeba również dodać/r do XCopy poleceń. W przeciwnym razie zawiesi się. (/ Y - pomija monit o potwierdzenie zamiaru zastąpienia istniejącego pliku docelowego). – miro

2

Building off @Murat's answer, Qt rzeczywiście has built-in functions do konwersji filepath do preferencji systemu lokalnego.

$$shell_path(<your path>) //Converts to OS path divider preference. 
$$clean_path(<your path>) //Removes duplicate dividers. 

nazwać to lubią: $$shell_path($$clean_path(<your path>)) lub $$clean_path() dokona konwersji dzielniki powrotem do dzielników Linux stylu.

Działa to dla mnie na Windows:

#For our copy command, we neeed to fix the filepaths to use Windows-style path dividers. 
SHADER_SOURCE_PATH = $$shell_path($$clean_path("$${SOURCE_ROOT}\\Engine\\Shaders\\")) 
SHADER_DESTINATION = $$shell_path($$clean_path("$${PROJECT_BIN}\\Shaders\\")) 

#Create a command, using the 'cmd' command line and Window's 'xcopy', to copy our shaders folder 
#into the Game/Bin/Shaders/ directory. 
CopyShaders.commands = $$quote(cmd /c xcopy /Y /S /I $${SHADER_SOURCE_PATH} $${SHADER_DESTINATION}) 

#Add the command to Qt. 
QMAKE_EXTRA_TARGETS += CopyShaders 
POST_TARGETDEPS += CopyShaders