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 甚至不费心运行该步骤。

我应该如何获得它以便我可以构建一个配置然后另一个?

4

2 回答 2

4

您可以修改 IDL 文件的编译器设置,以根据目标平台为输出代理文件指定不同的文件名。(选择 IDL 文件上的属性,然后选择配置属性/MIDL/输出)。

  • 对于 Win32 版本,请使用foo_p_w32.c
  • 对于 x64 构建,请使用foo_p_x64.c

然后,在您的 Win32 项目设置中,排除foo_p_x64.cx64 项目的文件,反之亦然。

您需要对 _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 回答