我一直在为我们的软件栈开发一个跨平台的构建系统。具体来说,我正在处理构建系统的windows组件。
我们有许多项目,每个项目都有一个手工编码的.vcxproj。有些项目相互依赖,有些项目依赖于Qt。
我的.vcxproj文件在我迄今尝试过的五个项目中的三个项目中运行良好,但在其他两个项目上却以一种非常有趣的方式失败:
project\dir> msbuild /p:Configuration=Release /p:PropertyA=C:\path\to\project\root\ /p:Platform=x64 obj\project.vcxproj
Microsoft (R) Build Engine version 4.0.30319.17929
[Microsoft .NET Framework, version 4.0.30319.18047]
Copyright (C) Microsoft Corporation. All rights reserved.
Build started 16.07.2013 11:13:43.
Project "C:\path\to\project\root\obj\project.vcxproj" on node 1 (default targets).
PrepareForBuild:
Creating directory "C:\path\to\project\root\obj\x64_Int\Release_DLL_Int\".
InitializeBuildStatus:
Creating "C:\path\to\project\root\obj\x64_Int\Release_DLL_Int\project.unsuccessfulbuild" because "AlwaysCreate" was specified.
ClCompile:
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\AMD64\CL.exe /c /I"include path A" /I"include path B" /Zi /nologo /W3 /WX- /sdl /O2 /Oi /D NDEBUG /D _CRT_SECURE_NO_WARNINGS /D QT_CORE_LIB /D _WINDLL /D _MBCS /Gm- /EHsc /MD /GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Fo"C:\path\to\project\root\obj\x64_Int\Release_DLL_Int\\" /Fd"C:\path\to\project\root\obj\x64\\project.pdb" /Gd /TP /errorReport:queue
/nologo
src\main\cpp\source_a.cpp src\main\cpp\source_b.cpp src\main\cpp\source_c.cpp ...
????????????????????????????????????
c1xx : fatal error C1083: Cannot open source file: '????????????????????????????????????': No such file or directory [C:\path\to\project\root\obj\project.vcxproj]
????????????????????????????????
c1xx : fatal error C1083: Cannot open source file: '????????????????????????????????': No such file or directory [C:\path\to\project\root\obj\project.vcxproj]
...使用每个源文件的问号字符串之一,源文件路径中的每个字符都有一个问号。
这是在命令行上,但是如果我在Visual (2012)中打开项目,我可以看到这些字符的真实情况:
error C1083: Cannot open source file: '猀爀挀尀洀愀椀渀尀挀瀀瀀尀...⸀挀瀀瀀': No such file or directory
error C1083: Cannot open source file: '猀爀挀尀洀愀椀渀尀挀瀀瀀尀...⸀挀瀀瀀': No such file or directory
...(对不起,我删除了真实的文件名。)
文件名中的每个字符都被替换为一个中文字符。这是一个1:1的替代,与罗马和中文字符之间的一致关系,即\ -> 尀和cpp -> 挀瀀瀀。
在这些错误消息有一个汉字之前,我已经运行了带有诊断性详细的msbuild,并且在12000+输出行中没有任何地方--它在失败之前多次正确地列出源文件。
通过历史悠久的调试技术“随意注释”,我发现如果手动编辑vcxproj文件(以某些方式失败),问题就会消失,但是链接将失败,因为我已经注释掉了库路径或源文件。
在这两个失败的项目中,删除4-6源文件(随机删除,尽管它是一致的,注释掉相同的四个文件将始终要么工作,要么不工作)将修复它。在依赖于Qt的路径中,删除到$(QT5DIR)/include/QtCore的路径将修复问题,但由于找不到Qt而无法链接。
源文件都是ASCII编码的,在删除时修复问题的源文件中似乎没有任何一致的格式。
我已经在三台不同的电脑上试过了,两台Windows 7机器和8.1预览版。它在8.1上工作得很好,但是在Win 7机器上都失败了。
它似乎与项目中的文件数量无关,因为工作的项目中有一个比其中一个不工作的项目有更多的文件。
这似乎不是一个依赖关系问题,因为只有一个不工作的依赖于Qt,而工作和不工作的依赖似乎排除了项目间的依赖关系。
我意识到这是相当不错的,任何微软Gurus知道发生了什么吗?
问题1:我做错了什么?是什么导致了这种行为?
问题2:我对如何继续追踪这个问题有什么想法吗?
更新:
发布于 2013-07-16 19:33:44
那是微软的错误!
http://connect.microsoft.com/VisualStudio/feedback/details/774527
因此,现在我将在AdditionalOptions中省略新行(尽管它适用于某些项目.?)
不高兴这是一个解决办法,但它似乎奏效了。
发布于 2013-07-16 17:23:32
我猜是文本格式错误。反斜杠的值为U+005C,被转换成的字符的值为U+5C00 (根据http://www.scarfboy.com/coding/unicode-tool?s=U%2B5C00 )。cpp中的"c“也是同样的问题,我确信”p“也是如此。
我不太熟悉MSVC所支持的文本编码,但我会从查看编码开始,确保它们都是相同的,然后查看任何可能不正确地转换文件的内容,比如说,一个程序认为它是在运行ANSI文件,而不是扩展编码。您可能丢失了一个字节,或者您的宽字符的字节顺序可能会被翻转。
https://stackoverflow.com/questions/17682278
复制相似问题