5

Visual Studioでは、foo.idlをコンパイルすると、MIDLはfoo_p.cにプロキシ情報を生成します。

残念ながら、Win32ファイルとx64ファイルの場合、同じファイル名を使用します。Win32の場合、ファイルは次で始まります。

#if !defined(_M_IA64) && !defined(_M_AMD64)

x64の場合、ファイルは次で始まります。

#if defined(_M_AMD64)

Win32用にビルドしてすぐにx64用にビルドすると、foo_p.cファイルは置き換えられません。つまり、プロジェクトはリンクに失敗します。

アーキテクチャが間違っている場合にfoo_p.cファイルを削除するビルド前のイベントを試してみましたが、VSはそのステップを実行することすらしません。

1つの構成を構築してから、もう1つの構成を構築できるようにするには、どうすればよいですか?

4

2 に答える 2

4

IDL ファイルのコンパイラ設定を変更して、ターゲット プラットフォームに応じて出力プロキシ ファイルに別のファイル名を指定できます。(IDL ファイルの [プロパティ] を選択してから、[構成プロパティ] / [MIDL] / [出力] を選択します)。

  • Win32 ビルドの場合は、foo_p_w32.c
  • x64 ビルドの場合は、foo_p_x64.c

次に、Win32 プロジェクト設定でファイルfoo_p_x64.cを除外し、x64 プロジェクトではその逆を行います。

_i.c ファイルについても同じことを行う必要があります。そうしないと、Visual Studio は IDL をまったく再構築しないようです。

于 2008-10-21T09:43:31.437 に答える
0

自動ビルドが正常に機能するようにするために使用する構成の変更を次に示します。

変化する

<Tool
Name="VCMIDLTool"
TypeLibraryName="$(ProjectName).tlb"
OutputDirectory="$(SolutionDir)$(PlatformName)"
HeaderFileName="$(ProjectName)_h.h"
DLLDataFileName="$(ProjectName)_dlldata.c"
/>

<Tool
    Name="VCMIDLTool"
    TypeLibraryName="$(InputName).tlb"
    OutputDirectory="$(SolutionDir)$(PlatformName)"
    HeaderFileName="$(InputName)_i.h"
    DLLDataFileName="$(InputName)_dlldata.c"
    InterfaceIdentifierFileName="$(InputName)_i.c"
    ProxyFileName="$(InputName)_p.c"
/>

$(SolutionDir)$(PlatformName)を C++ の追加のインクルード ディレクトリに追加します。

例えば

<Tool Name="VCCLCompilerTool" ...
AdditionalIncludeDirectories="...;&quot;$(SolutionDir)$(PlatformName);&quot;"
于 2011-02-07T04:54:36.780 に答える