2010-12-08 5 views
6

J'ai une grande solution de studio visuel avec ~ 50 projets. Il existe des configurations pour StaticDebug, StaticRelease, Debug et Release. Certaines bibliothèques sont nécessaires sous forme de DLL statique et statique. Pour les obtenir, nous reconstruisons la solution avec une configuration différente. La fenêtre Configuration Manager est utilisée pour configurer les projets qui doivent générer les saveurs, la bibliothèque statique, la DLL dynamique ou les deux.Comment puis-je gérer des projets de bibliothèque de construction qui produisent à la fois une bibliothèque statique et une DLL?

Cela peut être assez difficile à gérer et c'est un peu ennuyeux d'avoir à construire la solution plusieurs fois et de sélectionner les configurations dans le bon ordre. Les versions statiques doivent être construites avant les versions non statiques. Je me demande, au lieu de ce schéma actuel, pourrait-il être plus simple à gérer si, pour les projets que je devais produire à la fois une DLL statique et une DLL dynamc, j'ai créé deux projets. Par exemple:

  • corelib
  • coredll

Je pouvais soit faire de ces deux projets de référence tous les mêmes fichiers et les construire deux fois, ou je me demande, serait-il possible de construire corelib puis obtenir CoreDll pour le lier pour générer la DLL? Je pense que ma question est la suivante: avez-vous des conseils sur la façon de structurer vos projets dans ce genre de situation?

Merci.

+0

J'utilise la méthode des deux projets, bien que je fasse habituellement des versions 32 et 64 bits de quelque chose, c'est essentiellement la même chose. Pouvez-vous le faire sans deux compiles? En VS je ne le pense pas. De makefiles, oui. – Tergiver

+0

... cependant, vous avez probablement des directives de compilation dans la source pour les deux versions différentes. À tout le moins, la version statique n'a pas besoin de DllMain. – Tergiver

+0

J'ai fourni une nouvelle réponse et supprimé l'ancienne –

Répondre

3

Faites une copie de votre dossier de projet original dans l'explorateur comme CoreLib.vcxproj (dans le cas d'autres VS vérifier l'extension le cas)

Ajouter CoreLib.vcxproj comme un projet existant à votre solution et sauver votre solution.

Aller à la Propriétés-> Configuration Propriétés-> Général de corelib.

Sélectionnez toutes les configurations (coin supérieur gauche).

Modifier la propriété Type de configuration à Bibliothèque statique.

Modifier la propriété Extension de la cible à .lib.

Append à la propriété répertoire intermédiaire par exemple \ Lib \.

Aller à la Propriétés-> Configuration Propriétés-> C/C++ -> Preporcessor

Sélectionnez Configuration Debug (coin supérieur gauche).

modifier maintenant la propriété préprocesseur Définitions et modifiez la ligne _USRDLL dans _USRLIB

Sélectionnez Configuration de presse (gauche coin supérieur).

modifier maintenant la propriété préprocesseur Définitions et changer la ligne _USRDLL dans _USRLIB

Dans votre tête-fichier que vous devriez avoir quelque chose comme ce qui suit:

#ifdef MyDll_EXPORTS 
#define MyDll_API  __declspec(dllexport) 
#else 
#define MyDll_API  __declspec(dllimport) 
#endif 

changement dans quelque chose comme le suivant:

#ifdef MyDll_EXPORTS  
#ifdef _USRLIB  
#define MyDll_API  
#else  
#define MyDll_API  __declspec(dllexport)  
#endif  
#else 
// Here must deploy your own logic whether static or dynamic linking is used. 
// read my comment below 
#define MyDll_API  __declspec(dllimport)  
#endif 

Maintenant, votre Build génère votre DLL d'origine et l'importation de lib, ainsi qu'une nouvelle librairie statique!

+0

@Scott Langham: Je pense qu'il est préférable de fournir 3 fichiers d'en-tête. Un pour la version dll et un pour la version lib, les deux incluant l'API réelle. –

1

Peut-être que vous pourriez vérifier ce qu'un système de construction comme CMake produit pour ce cas. Je suppose qu'il va générer deux projets pour chaque cas. Mais en créant la solution de cette façon, cela pourrait vous faire économiser beaucoup de travail.

Questions connexes