在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甚至不打算运行该步骤。
我该如何获取它以便我可以构建一个配置然后另一个配置?
答案 0 :(得分:4)
您可以修改IDL文件的编译器设置,以根据目标平台为输出代理文件指定不同的文件名。 (在IDL文件上选择Properties,然后选择Configuration Properties / MIDL / Output)。
foo_p_w32.c
foo_p_x64.c
然后,在Win32项目设置中,为x64项目排除文件foo_p_x64.c
,反之亦然。
您需要对_i.c文件执行相同的操作,否则Visual Studio似乎根本不会重建IDL。
答案 1 :(得分: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 ++其他包含目录
e.g。
<Tool Name="VCCLCompilerTool" ...
AdditionalIncludeDirectories="...;"$(SolutionDir)$(PlatformName);""