我一直在为我们的软件堆栈开发跨平台构建系统。具体来说,我正在构建构建系统的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 Studio(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,工作和非工作之间的共性似乎排除了项目间的依赖关系。
我意识到这很好,任何微软大师都知道发生了什么?
问题1:我做错了什么?什么可能导致这种行为?
问题2:有关如何继续追踪问题的任何想法?
更新
答案 0 :(得分:1)
我猜测文本格式错误。反斜杠的值为U + 005C,它被转换成的字符的值为U + 5C00(根据http://www.scarfboy.com/coding/unicode-tool?s=U%2B5C00)。同样的问题对于cpp中的“c”也是如此,我也确定“p”也是如此。
我并不熟悉MSVC支持的文本编码,但我首先要看的是编码并确保它们完全相同,然后查看可能会错误地转换文件的任何内容,例如程序认为它是在ANSI文件而不是扩展编码上运行。您可能会丢失一个字节,或者您的宽字符的字节顺序可能会被翻转。
答案 1 :(得分:1)
这是微软的错误!
http://connect.microsoft.com/VisualStudio/feedback/details/774527
所以,现在我要在AdditionalOptions中省略换行符(即使它适用于某些项目......?)
对此作为解决方案并不满意,但似乎有效。