MIDLは、/ env win32と/ env win64に同じファイルを生成します
-
03-07-2019 - |
質問
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はそのステップを実行することさえしません。
一方の構成を構築してからもう一方の構成を構築できるようにするにはどうすればよいですか?
解決
IDLファイルのコンパイラ設定を変更して、ターゲットプラットフォームに応じて出力プロキシファイルに異なるファイル名を指定できます。 (IDLファイルの[プロパティ]を選択し、次に[構成プロパティ] / [MIDL] / [出力]を選択します。)
- Win32ビルドの場合は、
foo_p_w32.c
を使用します
- x64ビルドの場合、
foo_p_x64.c
を使用します
次に、Win32プロジェクトの設定で、ファイル foo_p_x64.c
を除外します(x64プロジェクトの場合はその逆)。
_i.cファイルについても同じことを行う必要があります。そうしないと、Visual StudioはIDLをまったく再構築しないようです。
他のヒント
自動ビルドを正常に動作させるために使用する構成の変更を以下に示します
変更
<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 ++追加インクルードディレクトリに追加します
e.g。
<Tool Name="VCCLCompilerTool" ...
AdditionalIncludeDirectories="...;"$(SolutionDir)$(PlatformName);""
所属していません StackOverflow