我正在处理一个相当大的C ++代码库。代码库通常用于在Linux下编译,使用自定义构建脚本和makefile。我正在将代码移植到Visual Studio中,因为任何使用Visual Studio的人都会同意,这是一种手动操作的痛苦。
我自己看起来有点没用,所以我开始在Qt中编写自己的实用程序来分析代码库并生成一个解决方案文件和附带的.vcxproj
文件。我一直在使用QUuid
类为每个项目生成GUID,我正在使用QTextStream
来编写.sln
文件。
现在,问题出现了:当我打开生成的.sln
文件时,我看到以下错误。
我目前正在尝试生成一个我已在Visual Studio IDE中手动创建的解决方案。我将生成的.sln
文件与Visual Studio创建的文件进行了比较,除了以不同顺序出现的项目和GUID不匹配(显然)之外,我无法发现差异。我在这里提供了一个简化的问题示例。
Visual Studio生成了这个:
Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mylib", "mylib\mylib.vcxproj", "{35BAFEEE-35FA-4313-AF67-AF8AB7458451}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{35BAFEEE-35FA-4313-AF67-AF8AB7458451}.Debug|Win32.ActiveCfg = Debug|Win32
{35BAFEEE-35FA-4313-AF67-AF8AB7458451}.Debug|Win32.Build.0 = Debug|Win32
{35BAFEEE-35FA-4313-AF67-AF8AB7458451}.Release|Win32.ActiveCfg = Release|Win32
{35BAFEEE-35FA-4313-AF67-AF8AB7458451}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
我生成了这个:
Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mylib", "mylib\mylib.vcxproj", "{A09FDB84-49CD-4C14-9D7D-D813D2D905EF}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{A09FDB84-49CD-4C14-9D7D-D813D2D905EF}.Debug|Win32.ActiveCfg = Debug|Win32
{A09FDB84-49CD-4C14-9D7D-D813D2D905EF}.Debug|Win32.Build.0 = Debug|Win32
{A09FDB84-49CD-4C14-9D7D-D813D2D905EF}.Release|Win32.ActiveCfg = Release|Win32
{A09FDB84-49CD-4C14-9D7D-D813D2D905EF}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
以下是我的问题:
.sln
文件错误的更具体信息吗?我很确定问题不在于文本编码 - 我使用记事本来创建.sln
的UTF-8版本并尝试打开它。
鉴于一切,似乎我的GUID导致了这个问题 - 虽然我不确定如何或为什么。
我注意到这些文件之间唯一的主要区别是文件大小。这两个文件恰好相差3个字节,但是我无法使用文本编辑器在文件中看到任何内容。然而,Joel Spolsky的一篇文章让我思考。没有普通文本这样的东西 - 毕竟,一切只是1和0的表示。
我在十六进制编辑器中打开了两个文件,然后我在Microsoft生成的文件的开头找到了3个字节! (0xEF, 0xBB, 0xBF
)。这三个字节也出现在我在另一台机器上躺着的Visual Studio 2008解决方案中。在开始编写解决方案之前,我可能会编写代码将这些字节放入文件中,但这仍然引出了一个问题:
这些字节到底是什么,为什么微软会使用它们?
答案 0 :(得分:3)
您正在考虑的是UTF-8 byte order mark。
它用于指示文件是UTF-8编码的,并且它应该呈现为空的零宽度空间。如果您有选择,请不要使用它 - 它使标准文本编辑器更难以阅读文件。
用记事本打开文件并将其保存为UTF-8编码文本将为您添加这三个字节。但同样,不要在可以便携阅读的文件上使用BOM。
答案 1 :(得分:0)
使用Visual Studio调试Visual Studio:
在使用Visual Studio打开生成的解决方案之前,打开另一个Visual Studio实例,转到Debug->Exceptions
并选中所有复选框,然后转到Debug->Attach to Process...
并附加到devenv.exe
。现在在另一个VS中打开解决方案,你会得到一个休息和一个调用堆栈,可能会给你更多的信息。
答案 2 :(得分:0)
为了添加我接受的答案,在Qt的情况下,我使用了我用来编写解决方案文件的QTextStream
对象中的following method:
void QTextStream::setGenerateByteOrderMark ( bool generate )
语法是这样的:
QFile fileHandle("mylib.sln");
QTextStream fileStream(&fileHandle);
// ...file open and error handling goes here...
fileStream.setGenerateByteOrderMark(true);
fileStream << "\nMicrosoft Visual Studio Solution File, Format Version 11.00\n";
//etc, etc
这将确保您的文件具有字节顺序标记,在此特定情况下,Visual Studio需要打开该文件。