Midl gera o mesmo arquivo para /Env Win32 e /Env Win64
-
03-07-2019 - |
Pergunta
No Visual Studio, quando você compila Foo.idl, o MIDL gera as informações proxy em foo_p.c.
Infelizmente, para os arquivos Win32 e X64, ele usa o mesmo nome de arquivo. Para o Win32, o arquivo começa com:
#if !defined(_M_IA64) && !defined(_M_AMD64)
Para x64, o arquivo começa com:
#if defined(_M_AMD64)
Quando você constrói para o Win32 e depois constrói imediatamente para o X64, ele não substitui o arquivo foo_p.c, o que significa que o projeto falha ao vincular.
Tentei ter um evento pré-construção que exclui o arquivo foo_p.c se for para a arquitetura errada, mas o VS nem se preocupa em executar essa etapa.
Como devo obtê -lo para poder construir uma configuração e depois a outra?
Solução
Você pode modificar as configurações do compilador para o seu arquivo IDL para especificar um nome de arquivo diferente para o arquivo proxy de saída de acordo com a plataforma de destino. (Selecione Propriedades no arquivo IDL e, em seguida, Propriedades de Configuração / MIDL / Saída).
- Para compilações Win32, use
foo_p_w32.c
- Para construir x64, use
foo_p_x64.c
Em seguida, em suas configurações de projeto Win32, exclua o arquivo foo_p_x64.c
e vice -versa para o projeto X64.
Você precisa fazer o mesmo com o arquivo _i.c, caso contrário, o Visual Studio não parece reconstruir o IDL.
Outras dicas
Aqui estão as alterações de configuração que usamos para permitir que construções automatizadas funcionem de maneira limpa
Mudar
<Tool
Name="VCMIDLTool"
TypeLibraryName="$(ProjectName).tlb"
OutputDirectory="$(SolutionDir)$(PlatformName)"
HeaderFileName="$(ProjectName)_h.h"
DLLDataFileName="$(ProjectName)_dlldata.c"
/>
Para
<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"
/>
e adicione $ (SoluçãoDir) $ (nome da plataforma) para o seu C ++ inclui diretórios
por exemplo
<Tool Name="VCCLCompilerTool" ...
AdditionalIncludeDirectories="...;"$(SolutionDir)$(PlatformName);""