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?

Foi útil?

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="...;&quot;$(SolutionDir)$(PlatformName);&quot;"
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top