Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对于某些生成的项目,msbuild将文件名解释为中文字符,而不是其他项目_C++_Visual Studio 2012_Msbuild - Fatal编程技术网

C++ 对于某些生成的项目,msbuild将文件名解释为中文字符,而不是其他项目

C++ 对于某些生成的项目,msbuild将文件名解释为中文字符,而不是其他项目,c++,visual-studio-2012,msbuild,C++,Visual Studio 2012,Msbuild,我一直在为我们的软件堆栈开发一个跨平台构建系统。具体来说,我正在开发构建系统的windows组件 我们有很多项目,每个项目都有一个手工编码的.vcxproj。有些项目相互依赖,有些依赖于Qt 到目前为止,我尝试过的五个项目中有三个都可以使用我的.vcxproj文件,但其他两个项目却以一种非常有趣的方式失败了: project\dir> msbuild /p:Configuration=Release /p:PropertyA=C:\path\to\project\root\ /p:Plat

我一直在为我们的软件堆栈开发一个跨平台构建系统。具体来说,我正在开发构建系统的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编码的,删除时修复问题的源文件中似乎没有任何一致的格式

我已经在三台不同的计算机、两台Windows7计算机和一个8.1预览版上尝试过。它在8.1上运行良好,但在Win7机器上都失败

它似乎与项目中的文件数量无关,因为其中一个工作的项目的文件数量远远多于任何一个不工作的项目

这似乎不是一个依赖性问题,因为只有一个非工作的依赖于Qt,而工作和非工作之间的共性似乎排除了项目间的依赖性

我意识到这很好,微软的大师们知道发生了什么吗

问题1:我做错了什么?什么可能导致这种行为

问题2:我能做些什么来继续追踪问题,有什么想法吗

更新:

  • 如果我自己运行ClCompile行,它实际上会尝试编译所有内容,但找不到标准库。我认为这意味着在这种情况下这个问题不会发生
  • 我已经找到了我认为在这里工作的东西:但我仍然希望有人能用一个真正的解决方案来回答。为什么会发生这种情况?为什么删除.vcxproj中看似随机的部分可以解决这个问题?是否有一种编码检测启发式方法会误解我的路径
我猜是文本格式错误。反斜杠的值为U+005C,它转换成的字符的值为U+5C00(根据)。同样的问题也适用于cpp中的“c”,我确信“p”也是如此


我对MSVC支持的文本编码不是很熟悉,但我会先看看编码,确保它们都是一样的,然后看看可能错误地转换文件的任何东西,比如一个认为它是在ANSI文件上操作而不是在扩展编码的程序。您可能缺少一个字节,或者您的宽字符的字节顺序可能被翻转。

这是Microsoft的错误

所以,现在我将在其他选项中省略换行符(即使它在某些项目中有效…?)


作为一种解决方案,我并不高兴,但它似乎奏效了

哇,轮班的时候干得不错。我目前正在研究此问题,不确定它可能发生在何处。重新保存文件修复了对齐问题,这意味着您的文本编辑器检测到并更正了该问题,或者它实际上是有效的,但msbuild不支持该问题,而您的文本编辑器不支持保存该问题。我总是发现在十六进制编辑器中查看意外的“垃圾”数据很有用。它对于识别数据的真实性几乎总是很有用的。只是重新保存并不能修复它,即使删除某些东西也不能修复它。移除东西直到它被修复,然后重新添加东西并保存,再次破坏了它。无论如何,我找到了一种解决办法。非常感谢你,你的建议有助于缩小可能性。