Question

Dans Visual Studio, lors de la compilation de foo.idl, MIDL génère les informations de proxy dans foo_p.c.

Malheureusement, pour les fichiers Win32 et x64, il utilise le même nom de fichier. Pour Win32, le fichier commence par:

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

Pour x64, le fichier commence par:

#if defined(_M_AMD64)

Lorsque vous compilez pour Win32 puis immédiatement pour x64, il ne remplace pas le fichier foo_p.c, ce qui signifie que le projet ne parvient pas à être lié.

J'ai essayé d'avoir un événement de pré-construction qui supprime le fichier foo_p.c s'il s'agit d'une architecture incorrecte, mais VS ne se donne même pas la peine d'exécuter cette étape.

Comment puis-je l'obtenir pour pouvoir construire une configuration puis l'autre?

Était-ce utile?

La solution

Vous pouvez modifier les paramètres du compilateur de votre fichier IDL pour spécifier un nom de fichier différent pour le fichier proxy de sortie en fonction de la plate-forme cible. (Sélectionnez Propriétés dans le fichier IDL, puis Propriétés de configuration / MIDL / Sortie).

  • Pour les versions Win32, utilisez foo_p_w32.c
  • Pour les versions x64, utilisez foo_p_x64.c

Ensuite, dans les paramètres de votre projet Win32, excluez le fichier foo_p_x64.c et inversement pour le projet x64.

Vous devez faire de même pour le fichier _i.c, sinon Visual Studio ne semble pas reconstruire l'IDL du tout.

Autres conseils

Voici les modifications de configuration que nous utilisons pour permettre aux versions automatisées de fonctionner correctement

Changer

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

Pour

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

et ajoutez $ (SolutionDir) $ (PlatformName) à vos répertoires d'inclusion supplémentaires C ++

par exemple

<Tool Name="VCCLCompilerTool" ...
AdditionalIncludeDirectories="...;&quot;$(SolutionDir)$(PlatformName);&quot;"
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top