1

我正在处理一个相当大的 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

以下是我的问题:

  1. 这些特定的错误消息是什么意思?
  2. 有什么方法可以让我获得有关.sln文件问题的更具体信息吗?
  3. 我生成的 GUID 有问题吗?我是否应该使用 Visual Studio 工具来创建 GUID?
  4. 我丢失的文件中是否有一些元数据或其他不可见的特殊调味料?

我很确定问题不在于文本编码——我使用记事本创建了 UTF-8 版本.sln并尝试打开它。

鉴于一切,似乎是我的 GUID 导致了问题——尽管我不确定如何或为什么。

更新

我注意到这些文件之间的唯一主要区别是文件大小。这两个文件相差 3 个字节,但我使用文本编辑器在文件中看不到任何内容。然而,Joel Spolsky的一篇文章让我开始思考。没有纯文本这样的东西——毕竟,一切都只是 1 和 0 的表示。

我在十六进制编辑器中打开了这两个文件,然后,我在 Microsoft 生成的文件的开头找到了 3 个字节!( 0xEF, 0xBB, 0xBF)。这三个字节也出现在我在另一台机器上的 Visual Studio 2008 解决方案中。在开始编写解决方案之前,我可能会编写代码将这些字节放入文件中,但这仍然引出了一个问题:

这些字节到底是干什么用的,微软为什么要使用它们?

4

3 回答 3

3

您正在考虑的是UTF-8 字节顺序标记

它用于指示文件是 UTF-8 编码的,并且应该呈现为空白的零宽度空间。如果您有选择,请不要使用它——它会使文件更难用标准文本编辑器阅读。

使用记事本打开文件并将其保存为 UTF-8 编码文本将为您添加这三个字节。但同样,不要在旨在便携读取的文件上使用 BOM。

于 2012-10-25T20:29:04.553 回答
0

使用 Visual Studio 调试 Visual Studio:

在使用 Visual Studio 打开生成的解决方案之前,打开另一个 Visual Studio 实例,转到Debug->Exceptions并选中所有复选框,然后转到Debug->Attach to Process...并附加到devenv.exe. 现在在另一个 VS 中打开解决方案,您将获得一个中断和一个调用堆栈,这可能会为您提供更多信息。

于 2012-10-24T23:23:16.437 回答
0

为了补充我接受的答案,在 Qt 的情况下,我在用于编写解决方案文件的对象中使用了以下方法:QTextStream

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 需要它来打开文件。

于 2012-10-26T00:20:45.000 回答