【问题标题】:MIDL generates the same file for /env win32 and /env win64MIDL 为 /env win32 和 /env win64 生成相同的文件
【发布时间】:2010-09-18 06:53:23
【问题描述】:

在 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 文件,这意味着项目无法链接。

我尝试了一个 pre-build 事件,如果 foo_p.c 文件用于错误的架构,则删除该文件,但 VS 甚至懒得运行该步骤。

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

【问题讨论】:

    标签: visual-studio midl


    【解决方案1】:

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

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

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

    您需要对 _i.c 文件执行相同的操作,否则 Visual Studio 似乎根本不会重建 IDL。

    【讨论】:

    【解决方案2】:

    这里是我们用来让自动构建干净地工作的配置更改

    改变

    <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;"
    

    【讨论】:

      猜你喜欢
      • 2015-07-07
      • 2019-08-22
      • 2018-08-17
      • 1970-01-01
      • 2018-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      相关资源
      最近更新 更多