MIDL 为 /env win32 和 /env win64 生成相同的文件

发布于 2024-07-08 15:49:31 字数 445 浏览 10 评论 0原文

在 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 甚至懒得运行该步骤。

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

In Visual Studio, when you compile foo.idl, MIDL generates the proxy information in foo_p.c.

Unfortunately, for Win32 and x64 files, it uses the same filename. For Win32, the file starts with:

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

For x64, the file starts with:

#if defined(_M_AMD64)

When you build for Win32 and then immediately build for x64, it doesn't replace the foo_p.c file, meaning that the project fails to link.

I tried having a pre-build event that deletes the foo_p.c file if it's for the wrong architecture, but VS doesn't even bother to run that step.

How should I get it so that I can build one configuration and then the other?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

小情绪 2024-07-15 15:49:31

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

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

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

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

You could modify the compiler settings for your IDL file to specify a different file name for the output proxy file according to the target platform. (Select Properties on the IDL file, then Configuration Properties / MIDL / Output).

  • For Win32 builds, use foo_p_w32.c
  • For x64 builds, use foo_p_x64.c

Then, in your Win32 project settings, exclude the file foo_p_x64.c and vice versa for the x64 project.

You need to do the same for the _i.c file, otherwise Visual Studio doesn't seem to rebuild the IDL at all.

捂风挽笑 2024-07-15 15:49:31

以下是我们用来允许自动构建干净地工作的配置

更改更改

<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="...;"$(SolutionDir)$(PlatformName);""

Here are the configuration changes we use to allow automated builds to work cleanly

Change

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

To

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

and add $(SolutionDir)$(PlatformName) to your C++ Additional Include Directories

e.g.

<Tool Name="VCCLCompilerTool" ...
AdditionalIncludeDirectories="...;"$(SolutionDir)$(PlatformName);""
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文