2013-02-18 78 views
5

是否有办法将windows样式路径获取到包含.pro的目录或将_PRO_FILE_PWD_中存储的内容转换为Windows样式路径?将Unix路径转换为QMake脚本中的窗口


我有在QMAKE的_PRO_FILE_PWD_变量它返回Windows上的UNIX风格路径的问题。

e.g c:/foo/bar代替c:\foo\bar

这被证明是在路径被用作一个链接后步骤的一部分的问题。

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

我用.pro文件创建一个Visual Studio项目,我可以看到,如果我手动更改斜线向后斜杠在VS一切都没有任何错误复制的罚款。

如果我不纠正路径,我在Visual Studio中出现以下错误。

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. 

解决方案

非常简单的解决方案由于Roku公司通过使用/字符添加路径周围逃脱双引号。

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

有关添加多个复制命令的注意事项,必须使用分号分隔它们,分号不起作用。

例如

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

确定的字符/是什么问题?它在Windows中几乎可以在任何地方使用你是否将复制行复制粘贴到命令提示符并在那里尝试过?最后一个;是问题吗? – 2013-02-18 16:06:33

+0

@Roku我刚刚尝试过命令提示符。它不适用于/ only \。 The;是因为我有几个副本命令..我已经尝试没有... – volting 2013-02-18 17:11:45

回答

0

我用/字符添加路径周围逃脱双引号得到这个工作:

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

感谢Roku寻找一个非常简单的解决方案!注意分号不能用于分隔多个命令 - 我必须使用&符号。 – volting 2013-02-18 18:51:48

+1

此解决方案不是crossplateform:您应该更喜欢使用$$ shell_path() – 2013-12-19 16:08:53

+0

的@edwinc答案当源路径使用正斜杠时,它也不起作用。 Qt4增加了一个解决方法 – AntonyG 2015-06-11 07:27:41

10

$$shell_path()将转换斜线到本地系统格式,所以:

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

为我赢得胜利8/Qt 5.4谢谢!您也可以调用'$$ QMAKE_COPY'而不是'copy/y',并将其替换为平台独立版本的副本。 – amenthes 2015-03-25 20:49:08

3

奇怪足够的,逃避双引号工作的目标文件,但不是源。

即这个工程:

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

但这并不:QT5下

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

如前所述,$$shell_path(path)作品。

在Qt4上,可以使用$$replace(string, old_string, new_string)

例子:

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

太棒了。感谢您将qt4和qt5解决方案放在那里。 – macetw 2016-01-12 13:20:00