What does (set PATH=…;%PATH:)=^)%) mean in a Windo

2019-06-22 06:48发布

问题:

In the context of an obstacle-ridden process of attempting to build Qt5 (32-bit) with VS 2012, I have run into yet another build error.

It is:

(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 : fatal error U1077: '(set' : return code '0xc0000135'

Stop.

I cannot find anything relevant about the (set PATH=...;%PATH:)=^)%) failure issue (returning error code 0xc0000135) when I perform a detailed Google/StackOverflow search.

Note that nmake proceeds for a long time (more than 1 hour) happily switching directories, running intermediate .exe's, and both compiling and linking code files.

I am running nmake (as well as having run configure) in the 32-bit Visual Studio 2012 Tools command prompt; and as far as I know, all of my path variables are properly set (they include the paths to 32-bit Perl and to 32-bit Python, although I don't think that is relevant here).

I have restarted my computer, and I ran the VS 2012 Tools Command Prompt with Administrator privileges (in case it is a permissions error), attempting to run nmake, and the same error occurs.

I then attempted to try to figure out what the error actually is. At that point, I became stumped by the syntax of this command-line statement that is apparently being executed within a Makefile-triggered shell script:

(set PATH=...;%PATH:)=^)%)
                   ^^^^^^ // What do the symbols :)=^)% mean?

I do not understand the symbols :)=^)% in the context of this script.

Can somebody tell me what these symbols mean in the context of a Windows shell script (that is being executed in the context of an nmake Makefile (building 32-bit Qt5 with VS 2012))?

As an added optional question, what can I do to overcome this error and continue to build Qt5 without this error blocking progress?

回答1:

The (set PATH=...;%PATH:)=^)%) is a string substitution. Look up 'environment variable substitution' in the help set command output for more information.

The script prepends the PATH variable, but during the substitution it escapes the right parens so the whole line is correctly formatted. For example, the %PATH% might contain a substring "Program Files (x86)" that will break the set syntax upon expansion. The ^ symbol before the paren is just a batch escaping symbol.

Second, the (...) & ... is a grouping operator that allows multiple commands to be written on the same line. Why the script author decided to place those two commands on the same line is unknown to me, but it has definitely helped to obscure the error.

Third, though NMAKE reports an error for the '(set' command, quick checking proved that the return code (%ERRORLEVEL%) is set by the last command of the group, so there is no use of googling the 0xc0000135 error for the SET and NMAKE commands.

The actual source of the error is the 'uic.exe', that is located in:

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

Regarding the error, 0xc0000135 - this is The application failed to initialize properly error. My guess is either that the 'uic.exe' was built with the incompatible toolchain/SDK, or requires some missing dlls.

P.S. An alternative solution: the similar problem has been solved by using jom instead of nmake.



回答2:

I had the same problem. I decided to add it to the PATH path to the libraries icu.



回答3:

I had the same issue compiling Qt5.3 in Win8. The solution is to make sure you include the ICU and openSSL 32-bin binaries location in the PATH variable. If you don't uic.exe doesn't work properly



回答4:

I had the same problem, in my case I used a bad compiled ICU ( compiled with VS2012 ) trying to use icu with VS2008, I solve it compiling ICU with VS2008 and using these compiled version of ICU on my VS2008 project.