为什么我的生成的.sln文件不会在Visual Studio 2010中打开?

时间:2012-10-24 23:19:23

标签: c++ visual-studio-2010 qt

我正在处理一个相当大的C ++代码库。代码库通常用于在Linux下编译,使用自定义构建脚本和makefile。我正在将代码移植到Visual Studio中,因为任何使用Visual Studio的人都会同意,这是一种手动操作的痛苦。

我自己看起来有点没用,所以我开始在Qt中编写自己的实用程序来分析代码库并生成一个解决方案文件和附带的.vcxproj文件。我一直在使用QUuid类为每个项目生成GUID,我正在使用QTextStream来编写.sln文件。

现在,问题出现了:当我打开生成的.sln文件时,我看到以下错误。 The selected file is not a valid solution file The system can not find the file specified

我目前正在尝试生成一个我已在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. 文件中是否有一些我缺少的元数据或其他隐形特殊酱?
  5. 我很确定问题不在于文本编码 - 我使用记事本来创建.sln的UTF-8版本并尝试打开它。

    鉴于一切,似乎我的GUID导致了这个问题 - 虽然我不确定如何或为什么。

    更新

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

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

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

3 个答案:

答案 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需要打开该文件。