2008-10-21 3 views
4

Dans Visual Studio, lorsque vous compilez foo.idl, MIDL génère les informations de proxy dans foo_p.c.MIDL génère le même fichier pour/env win32 et/env win64

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) 

x64, le fichier commence par:

#if defined(_M_AMD64) 

Lorsque vous construisez pour Win32 puis construire immédiatement pour x64, il ne remplace pas le foo_p. c fichier, ce qui signifie que le projet ne parvient pas à lier.

J'ai essayé d'avoir un événement de pré-construction qui supprime le fichier foo_p.c si c'est pour la mauvaise architecture, mais VS ne prend même pas la peine d'exécuter cette étape.

Comment l'obtenir pour que je puisse construire une configuration et l'autre?

Répondre

4

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 Win32 construit, utilisez foo_p_w32.c
  • x64 construit, utilisez foo_p_x64.c

Ensuite, dans les paramètres du projet Win32, exclure le fichier foo_p_x64.c et vice versa pour le projet x64.

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

+0

Cette suce, mais il est probablement la seule solution depuis génération à double stub dans Visual Studio semble être rompu (voir http://connect.microsoft.com/VisualStudio/feedback/details/648537/midl-v7 -00-0555-ne-crée-pas-double-stubs-par-défaut). Merci d'avoir posté votre réponse! –

0

Voici les changements de configuration que nous utilisons pour permettre automatisé builds de travailler proprement

changement

<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 ajouter $ (SolutionDir) $ (PlatformName) à votre C++ supplémentaires Inclure les répertoires

par exemple.

<Tool Name="VCCLCompilerTool" ... 
AdditionalIncludeDirectories="...;&quot;$(SolutionDir)$(PlatformName);&quot;" 
Questions connexes