我正在处理一个相当大的 C++ 代码库。代码库通常旨在使用自定义构建脚本和 makefile 在 Linux 下编译。我将代码移植到 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
文件问题的更具体信息吗? - 我生成的 GUID 有问题吗?我是否应该使用 Visual Studio 工具来创建 GUID?
- 我丢失的文件中是否有一些元数据或其他不可见的特殊调味料?
我很确定问题不在于文本编码——我使用记事本创建了 UTF-8 版本.sln
并尝试打开它。
鉴于一切,似乎是我的 GUID 导致了问题——尽管我不确定如何或为什么。
更新
我注意到这些文件之间的唯一主要区别是文件大小。这两个文件相差 3 个字节,但我使用文本编辑器在文件中看不到任何内容。然而,Joel Spolsky的一篇文章让我开始思考。没有纯文本这样的东西——毕竟,一切都只是 1 和 0 的表示。
我在十六进制编辑器中打开了这两个文件,然后,我在 Microsoft 生成的文件的开头找到了 3 个字节!( 0xEF, 0xBB, 0xBF
)。这三个字节也出现在我在另一台机器上的 Visual Studio 2008 解决方案中。在开始编写解决方案之前,我可能会编写代码将这些字节放入文件中,但这仍然引出了一个问题:
这些字节到底是干什么用的,微软为什么要使用它们?