5

複雑なサード パーティの C++ ライブラリを統合するために、Visual Studio 2010 のプロパティ シートを作成しています。

ライブラリのどの部分をプロジェクトにリンクする必要があるかを判断するには (さまざまな定義、インクルード、ディレクトリなどを構成するだけでなく)、プロパティ シートでプロジェクトの現在構成されている C ランタイム ライブラリ (つまり、「マルチスレッド」、「 MultiThreadedDebug"、"MultiThreadedDLL"、または "MultiThreadedDebugDLL")。

ただし、 stackoverflowに関する実質的に同様の質問が指摘したように、この MSBuild 条件は機能しません。

Condition = " '$(RuntimeLibrary)' == 'MultiThreadedDLL' "

別のオプションが提供されましたが、それは後続のビルド タスク用でした。ビルドに到達する前に、この値が必要です。

また、この値を取得する方法を探して、Google と Microsoft の MSDN Web サイトを精査しましたが、何も見つかりませんでした。何か案は?

4

1 に答える 1

3

MSBuild の XML を介して構成されたランタイム ライブラリを直接取得する方法がなかったため、プロジェクト ファイルを正規表現しました。これを行うための XML PropertyGroup スニペットを次に示します。

<PropertyGroup Label="UserMacros">
  <RuntimeLibraryRegex>
    <![CDATA[<ItemDefinitionGroup Condition=".*']]>$(Configuration)\|$(Platform)<![CDATA['">(?:.*\n)*?.*<RuntimeLibrary>(.*)</RuntimeLibrary>(?:.*\n)*?.*</ItemDefinitionGroup>]]>
  </RuntimeLibraryRegex>
  <RuntimeLibrary>
    $([System.Text.RegularExpressions.Regex]::Match($([System.IO.File]::ReadAllText($(MSBuildProjectFullPath))), $(RuntimeLibraryRegex)).Result('$1'))
  </RuntimeLibrary>
</PropertyGroup>

これで、質問の条件ステートメントはそのまま機能します。

また、この MSBuild プロパティ グループ XML はランタイム ライブラリの既定値を考慮していませんが (たとえば、プロジェクトにランタイム ライブラリが設定されていない場合)、簡単に作成できることに注意してください。

于 2012-10-03T19:48:54.630 に答える