2013-02-18 5 views
5

Gibt es trotzdem, um den Windows-Stil Pfad zu dem Verzeichnis, das die .pro enthält oder konvertieren, was in _PRO_FILE_PWD_ in einem Windows-Stil Pfad gespeichert ist?Convert Unix Pfad zu Windows in QMake Skript


Ich habe ein Problem mit der _PRO_FILE_PWD_ Variable in Qmake, wo es einen Weg Unix-Stil auf Windows zurückgibt.

z.B c:/foo/bar anstelle von c:\foo\bar

Dies erweist sich ein Problem, wo der Pfad als Teil eines Postverbindungsschritt verwendet wird.

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

Ich verwende die .pro Datei ein Visual Studio-Projekt zu erstellen, und das kann ich sehen, ob ich die Vorwärts manuell ändern Schrägstriche Schrägstriche in VS zu sichern, dass alles ohne Fehler fein kopiert wird.

Ich bekomme den folgenden Fehler in Visual Studio, wenn ich den Pfad nicht korrigieren.

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. 

Lösung

Sehr einfache Lösung dank Roku mit/Zeichen rund um den Weg entkommen doppelte Anführungszeichen hinzufügen.

Hinweis zum Hinzufügen mehrerer Kopierbefehle müssen Sie sie mit dem kaufmännischen Und trennen, das Semikolon funktioniert nicht.

z.B.

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

Sind Sie sicher, dass das Zeichen/ist das Problem? Es funktioniert fast überall in Windows. Haben Sie die Kopierzeile an die Eingabeaufforderung kopiert und dort versucht? Könnte das Letzte sein; sei das Problem? –

+0

@Roku Ich habe gerade an der Eingabeaufforderung versucht .. Es funktioniert nicht mit/nur \. Das ; gibt es da habe ich ein paar kopierbefehle .. ich habe es versucht ohne ... – volting

Antwort

0

bekam ich diese Arbeit durch entkam Hinzufügen doppelte Anführungszeichen um den Pfad/Zeichen:

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

Danke Roku für das Finden einer sehr einfachen Lösung! Beachten Sie, dass das Semikolon zum Trennen mehrerer Befehle nicht funktioniert. Ich musste das kaufmännische Und-Zeichen verwenden. – volting

+1

Diese Lösung ist keine Kreuztabellenform: Sie sollten @edwinc antworten mit $$ shell_path() –

+0

Es funktioniert auch nicht, wenn der Quellpfad Schrägstriche verwendet. Eine Workaround für Qt4 hinzugefügt – AntonyG

10

$$shell_path() wird die Schrägstriche zu lokalen System-Format konvertieren, so:

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

arbeitete für mich auf Win 8/Qt 5.4 Danke! Sie könnten auch '$$ QMAKE_COPY' anstelle von' copy/y' aufrufen, dies wird durch eine plattformunabhängige Version der Kopie ersetzt. – amenthes

3

Seltsamer genug, die Doppelzitate zu umgehen funktioniert für die Zieldatei, aber nicht die Quelle.

heißt dies funktioniert:

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

aber nicht:

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

Wie bereits erwähnt, $$shell_path(path) Arbeiten unter QT5.

In Qt4 kann stattdessen $$replace(string, old_string, new_string) verwendet werden.

Beispiel:

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

Ehrfürchtig. Danke, dass Sie sowohl die qt4 als auch die qt5-Lösungen dort platziert haben. – macetw