繁体   English   中英

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

[英]Why won't my generated .sln file open in Visual Studio 2010?

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

这是我的问题:

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

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

鉴于一切,似乎我的GUID导致问题 - 虽然我不知道如何或为什么。

更新

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

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

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

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

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

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

使用Visual Studio调试Visual Studio:

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

为了添加我接受的答案,在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需要打开该文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM