1

私はかなり大きなC++コードベースを扱っています。コードベースは通常、カスタムビルドスクリプトとmakefileを使用してLinuxでコンパイルすることを目的としています。私はコードをVisualStudioに移植しています。これは、Visual Studioを使用している人なら誰でも同意するように、手動で行うのは面倒です。

私自身の見た目は役に立たなかったので、コードベースを分析してソリューションファイルと付随するファイルを生成するためにQtで独自のユーティリティを書き始めました.vcxproj。このクラスを使用してQUuid各プロジェクトのGUIDを生成しQTextStream、ファイルの書き込みに使用してい.slnます。

ここで問題が発生します。生成された.slnファイルを開くと、次のエラーが表示されます。 選択したファイルは有効なソリューションファイルではありません システムは、指定されたファイルを見つけることができません

現在、VisualStudioIDE内で既に手動で作成したソリューションを生成しようとしています。生成したファイルをVisualStudioで作成したファイルと比較.slnしましたが、プロジェクトの表示順序が異なり、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が問題を引き起こしているようですが、方法や理由はわかりません。

アップデート

これらのファイル間で私が気付いた唯一の大きな違いは、ファイルサイズでした。2つのファイルは正確に3バイト異なりますが、テキストエディタを使用してファイルに何も表示されませんでした。しかし、ジョエル・スポルスキーの記事に思いを馳せました。プレーンテキストのようなものはありません。結局のところ、すべてが1と0の単なる表現にすぎません。

2つのファイルを16進エディターで開いたところ、Microsoftが生成したファイルの先頭に3バイトが見つかりました。(0xEF, 0xBB, 0xBF)。これらの3バイトは、別のマシンで横になっていたVisualStudio2008ソリューションにも表示されます。ソリューションを書き始める前に、これらのバイトをファイルに挿入するコードを書くこともできますが、それでも疑問が残ります。

これらのバイトは一体何のためにあるのでしょうか。また、Microsoftがそれらを使用しているのはなぜですか。

4

3 に答える 3

3

あなたが考えているのは、UTF-8 バイト オーダー マークです。

これは、ファイルが UTF-8 でエンコードされていることを示すために使用され、空白のゼロ幅スペースとしてレンダリングされることになっています。選択肢がある場合は、使用しないでください。標準のテキスト エディタでファイルを読むのが難しくなります。

メモ帳でファイルを開き、UTF-8 でエンコードされたテキストとして保存すると、これらの 3 バイトが追加されます。ただし、繰り返しますが、移植可能な読み取りが意図されているファイルには BOM を使用しないでください。

于 2012-10-25T20:29:04.553 に答える
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 に答える
0

Visual Studio で Visual Studio をデバッグします。

生成されたソリューションを Visual Studio で開く前に、Visual Studio の別のインスタンスを開き、 に移動しDebug->Exceptionsてすべてのチェック ボックスをオンにし、 に移動してDebug->Attach to Process...にアタッチしdevenv.exeます。他の VS でソリューションを開くと、休憩とコール スタックが表示され、詳細情報が得られる場合があります。

于 2012-10-24T23:23:16.437 に答える