【问题标题】:Convert Unix path to windows in QMake Script在 QMake 脚本中将 Unix 路径转换为窗口
【发布时间】:2013-02-18 14:26:59
【问题描述】:

有没有办法获得包含.pro 的目录的windows 样式路径或将_PRO_FILE_PWD_ 中存储的内容转换为Windows 样式路径?


我对 Qmake 中的 _PRO_FILE_PWD_ 变量有疑问,它在 Windows 上返回 unix 样式路径。

例如 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/\";  

【问题讨论】:

  • 你确定字符 / 是问题吗?它几乎可以在 Windows 中的任何地方使用。您是否将复制行复制粘贴到命令提示符并在那里尝试过?可以最后一个;是问题吗?
  • @Roku 我刚刚在命令提示符下尝试过。它不适用于 / 仅 \。这 ;是不是因为我有一些复制命令..我试过没有...

标签: windows qt path qmake visual-studio-2010


【解决方案1】:

$$shell_path() 会将斜杠转换为本地系统格式,所以:

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

【讨论】:

  • 在 win 8 / Qt 5.4 上为我工作 谢谢!您也可以调用 $$QMAKE_COPY 而不是 copy /y 这将替换为独立于平台的副本版本。
【解决方案2】:

奇怪的是,转义双引号对目标文件有效,但对源文件无效。

即这行得通:

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

但这不是:

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) 在 Qt5 下工作。

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

例子:

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

【讨论】:

  • 太棒了。感谢您将 qt4 和 qt5 解决方案放在那里。
【解决方案3】:

我通过使用 / 字符在路径周围添加转义双引号来实现此功能:

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

【讨论】:

  • 感谢 Roku 找到了一个非常简单的解决方案!请注意,分号不能用于分隔多个命令 - 我必须使用与号。
  • 此解决方案不是跨平台的:您应该更喜欢使用 $$shell_path() 的@edwinc 答案
  • 当源路径使用正斜杠时也不起作用。为 Qt4 添加了解决方法
猜你喜欢
  • 2010-10-13
  • 2019-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-28
  • 2012-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多