在Windows shell脚本中,(set PATH=...;%PATH:)=^)%)这句话是什么意思?在Qt5 nmake构建的上下文中,我该如何克服这行代码的失败?

5
在尝试使用VS 2012构建Qt5(32位)的障碍重重的过程中,我又遇到了另一个构建错误。 它是: (set PATH=C:\Users\daniel347x\Desktop\Backup\__Dan_Root\qt5\qtbase\lib;%PATH:)=^)%) & C:\Users\daniel347x\Desktop\Backup__Dan_Root\qt5\qtbase\bin\uic.exe dialogs\qfiledialog.ui -o ui_qfiledialog.h NMAKE:致命错误U1077: '(set':返回代码'0xc0000135' 停止。 当我进行详细的Google / StackOverflow搜索时,我找不到与(set PATH=...;%PATH:)=^)%)失败问题(返回错误代码0xc0000135)有关的任何相关信息。
请注意,nmake会花费很长时间(超过1小时),快乐地切换目录,运行中间的.exe文件,并编译和链接代码文件。
我在32位Visual Studio 2012工具命令提示符中运行nmake(以及运行configure),据我所知,所有我的path变量都已正确设置(它们包括32位Perl和32位Python的路径,尽管我认为这与此处无关)。
我已经重新启动了计算机,并使用管理员权限运行了VS 2012工具命令提示符(以防出现权限错误),尝试运行nmake,但仍然出现相同的错误。
然后,我尝试弄清楚错误实际上是什么。此时,我被触发Makefile的shell脚本内部执行的命令行语句的语法所困扰:
(set PATH=...;%PATH:)=^)%)
                   ^^^^^^ // What do the symbols :)=^)% mean?

我不理解这个脚本中:)=^)%这些符号的含义。
在一个Windows shell脚本的上下文中,有人能告诉我这些符号的含义吗?(该脚本在nmake Makefile的上下文中执行(使用VS 2012构建32位Qt5))
作为一个额外的可选问题,我可以做什么来克服这个错误并继续构建Qt5,而不会阻碍进展?

1
我相信那些是对路径变量进行字符串操作,但我不确定它们具体在做什么。 - metalhead
如果目标只是在路径前面添加一个新目录,而不需要进行字符串操作,则可以将 :>=^)% 替换为 %,从而得到 (set PATH=...;%PATH%)。 - GregA100k
我不太敢修改Qt makefile脚本,至少要了解字符串操作的实际作用。 - Dan Nissenbaum
4个回答

9

(set PATH=...;%PATH:)=^)%)是一个字符串替换。在help set命令输出中查找“环境变量替换”以获取更多信息。

该脚本会在PATH变量前添加内容,但在替换过程中会转义右括号,以使整行格式正确。例如,%PATH%可能包含一个子字符串“Program Files(x86)”,这将在扩展时破坏set语法。括号前的^符号只是批处理转义符号。

其次,(...) & ...是一个分组运算符,允许在同一行上编写多个命令。为什么脚本作者决定将这两个命令放在同一行上我不知道,但它肯定有助于掩盖错误。

第三,虽然NMAKE对“(set”命令报告错误,但快速检查证明,组的最后一个命令设置了返回代码(%ERRORLEVEL%),因此没有必要为SET和NMAKE命令搜索0xc0000135错误。

实际错误源是'uic.exe',它位于:

C:\Users\daniel347x\Desktop\Backup__Dan_Root\qt5\qtbase\bin\uic.exe

关于错误 0xc0000135 - 这是“应用程序无法正常初始化”错误。我的猜测是 'uic.exe' 可能使用了不兼容的工具链/SDK,或者需要一些缺失的 dll。
另外解决方案:类似问题已经得到解决,可以使用 jom 替代 nmake。

2
这让我立刻使用Dependency Walker来调查 uic.exe,结果显示缺少了 icu DLL。很明显,虽然我已经添加了ICU的includelib路径,但我没有添加包含ICU DLL的运行时路径,问题得到了解决。事实上,Shell脚本系统在识别错误源方面表现非常糟糕。 - Dan Nissenbaum
@DanNissenbaum 你应该将你的评论放在或请求将其添加为解决此问题的可能性之一。它真的节省了我很多时间。 - BRabbit27

1
我也遇到了同样的问题。我决定将它添加到PATH路径下的icu库中。

0

我曾经遇到过同样的问题,在我的情况下,我使用了一个错误编译的 ICU(使用 VS2012 编译),试图在 VS2008 中使用 icu,我解决了这个问题,通过使用 VS2008 编译 ICU 并在我的 VS2008 项目中使用这些编译版本的 ICU。


0

我在Win8下编译Qt5.3时遇到了同样的问题。解决方法是确保在PATH变量中包含32位二进制位置的ICU和openSSL。否则,uic.exe将无法正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接