2013-02-18 8 views
5

Esiste comunque un modo per ottenere il percorso di stile di Windows nella directory contenente lo .pro o convertire ciò che viene memorizzato in _PRO_FILE_PWD_ in un percorso di stile Windows?Converti percorso Unix in Windows in QMake Script


Ho un problema con la variabile _PRO_FILE_PWD_ in Qmake dove restituisce un percorso in stile Unix su Windows.

es c:/foo/bar anziché c:\foo\bar

Questo si sta rivelando un problema in cui il percorso viene utilizzato come parte di una fase di post collegamento.

QMAKE_POST_LINK += copy /y $$[QT_INSTALL_BINS]\\QtCore4.dll $${_PRO_FILE_PWD_}/bin/; 

Io uso il file .pro per creare un progetto di Visual Studio e posso vedere che se cambio manualmente la slash per eseguire tagli in VS che tutto viene copiato bene senza errori.

Ottengo il seguente errore in Visual Studio se non corrego il percorso.

PostBuildEvent: 
1> Description: copy /y C:\Qt\4.8.3\bin\QtCore4.dll E:/foo/build/win32//bin//; 
1> The syntax of the command is incorrect. 
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets(113,5): error MSB3073: The command "copy /y C:\Qt\4.8.3\bin\QtCore4.dll E:/foo/build/win32/bin/; 
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets(113,5): error MSB3073: :VCEnd" exited with code 1. 

Soluzione

soluzione molto semplice grazie al Roku con l'aggiunta di virgolette doppie sfuggiti tutto il percorso utilizzando/caratteri.

MAKE_POST_LINK += 
    copy /y $$[QT_INSTALL_BINS]\\QtCore4.dll \"$${_PRO_FILE_PWD_}/bin/\"; 

Nota per addingi copia più comandi è necessario separati loro con la e commerciale del punto e virgola non funziona.

ad es.

MAKE_POST_LINK += 
     copy /y $$[QT_INSTALL_BINS]\\QtCore4.dll \"$${_PRO_FILE_PWD_}/bin/\" & 
    MAKE_POST_LINK += 
     copy /y $$[QT_INSTALL_BINS]\\QtGui4.dll \"$${_PRO_FILE_PWD_}/bin/\"; 
+0

Sei sicuro che il carattere/è il problema? Funziona quasi ovunque in Windows. Hai copiato la linea di copia sul prompt dei comandi e l'hai provato? Potrebbe l'ultimo; essere il problema? –

+0

@Roku Ho appena provato al prompt dei comandi. Non funziona con/solo \. Il ; è lì perché ho alcuni comandi di copia .. Ho provato senza ... – volting

risposta

0

Ho ottenuto questo lavoro con l'aggiunta di virgolette doppie sfuggiti tutto il percorso utilizzando/personaggi:

QMAKE_POST_LINK += 
    copy /y $$[QT_INSTALL_BINS]\\QtCore4.dll \"$${_PRO_FILE_PWD_}/bin/\"; 
+0

Grazie Roku per aver trovato una soluzione molto semplice! Nota che il punto e virgola non funziona per separare più comandi: ho dovuto usare la e commerciale. – volting

+1

Questa soluzione non è crossplateform: si dovrebbe preferire la risposta @edwinc usando $$ shell_path() –

+0

Inoltre, non funziona quando il percorso di origine utilizza barre in avanti. Aggiunta una soluzione alternativa per Qt4 – AntonyG

10

$$shell_path() convertirà i tagli a formato del sistema locale, quindi:

QMAKE_POST_LINK += copy /y "$$shell_path($$QT_INSTALL_BINS/QtCore4.dll)" "$$shell_path($$_PROD_FILE_PWD_/bin)" 
+0

ha funzionato per me su win 8/Qt 5.4 Grazie! Puoi anche chiamare '$$ QMAKE_COPY' invece di' copy/y' questo viene sostituito con una versione indipendente dalla piattaforma di copia. – amenthes

3

Stranamente abbastanza, sfuggire alle doppie virgolette funziona per il file di destinazione ma non per la sorgente.

cioè funziona:

copy C:\dev\playground\qt\SampleProject\debug_qt.conf "C:/dev/playground/qt/build-SampleProject-Qt_8_4_6_Desktop-Debug/qt.conf" 

ma questo non:

copy "C:/dev/playground/qt/SampleProject/debug_qt.conf" "C:/dev/playground/qt/build-SampleProject-Qt_8_4_6_Desktop-Debug/qt.conf" 

Come già notato, $$shell_path(path) lavori sotto QT5.

Su Qt4, è possibile utilizzare invece $$replace(string, old_string, new_string).

Esempio:

MY_PATH = $$PWD 
message($$replace(MY_PATH, /, \\)) 
+0

Fantastico. Grazie per aver implementato entrambe le soluzioni qt4 e qt5. – macetw