MIDL génère le même fichier pour / env win32 et / env win64
-
03-07-2019 - |
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?
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="...;"$(SolutionDir)$(PlatformName);""