2008-10-10 10 views
4

J'essaye de créer une bibliothèque de C++ pour l'usage sur windows/MSVC. Mon problème est qu'il me semble que pour lier correctement, j'ai besoin de distribuer un tas de versions différentes, liées à différentes versions des runtimes C++ de MSVC - single et multi-thread, debug et release, différentes versions du compilateur, diverses autres options de sécurité et autres.Création de bibliothèques Windows C++ sans runtime?

J'aimerais distribuer juste deux, 32 bits et 64 bits.

Mon idée est peut-être d'utiliser un nouvel opérateur différent (disons mynew) et des allocateurs personnalisés pour tous mes types STL. Lors de la création de la lib,/nodefaultlib. Ensuite, lorsque vous créez un lien à partir d'un projet parent, demandez-leur d'ajouter mynew à new, et mon allocateur stl à celui standard (ou à celui de leur choix). Je suppose que je devrais faire supprimer, et quelques autres fonctions. Naturellement, je fournirais un exemple de mise en œuvre thunking avec la bibliothèque, mais cela devrait, espérons-le, sauver beaucoup de maux de tête.

Est-ce possible? Est-ce que quelqu'un a déjà essayé ça? Existe-t-il des meilleures pratiques pour la création/distribution de bibliothèques sur Windows/MSVC?

Répondre

6

Vous voulez une liaison statique, comme réponse générale.

Note rapide sur la réponse de Chris (ne veulent pas de-boost car c'est surtout bon, mais ...):

ne relions pas à msvcrt.dll (celui versionnés); Il s'agit de la DLL de la version spécifique au système d'exploitation, et si vous la liez, votre application ne fonctionnera probablement pas sur les autres versions de Windows. Vous devriez toujours être lié à msvcrt ##. Dll, autant que je sache. Le DDK peut contenir une lib pour cela, mais ne le liez pas à moins que vous ne sachiez vraiment ce que vous faites.

+0

J'ai augmenté votre réponse. Vous ne voulez normalement pas utiliser msvcrt.dll, et l'approche DDK est non documentée et non supportée autant que je sache. D'où le "tu n'as pas entendu ça de moi". :-) –

0

Vous n'avez pas besoin d'utiliser un allocateur personnalisé si vous utilisez C++ et vous enveloppez toutes les allocations autour de std::tr1::shared_ptr (où vous pouvez spécifier une fonction de désallocation). Cela garantit que même lorsque les clients publient la dernière référence au pointeur partagé, c'est toujours le code dans votre bibliothèque (ou le CRT de votre bibliothèque) qui est appelé lorsque l'objet doit être libéré.

Ceci est une façon de résoudre "DLL boundary hell". J'espère que cela aide! :-)

Modifier: Je pense que j'ai mal lu l'intention de votre question. Plutôt que de ne vouloir aucune dépendance sur un CRT parce que vous êtes inquiet au sujet de l'enfer de la frontière DLL, je suppose que vous vouliez juste une version de votre DLL que vous pouvez installer n'importe où. Dans ce cas, vous pouvez créer un lien vers le programme msvcrt.dll. C'est disponible sur n'importe quel système Windows.

Vous n'avez pas entendu cela de moi, mais apparemment dans le Kit de développement de pilotes, vous pouvez trouver une sorte de bibliothèque d'importation qui permet aux nouvelles versions de Visual Studio de lier à msvcrt.

+0

Voir mon commentaire à propos de msvcrt.dll, corriger l'un de nous ... – Nick

+0

Je suis d'accord avec votre point. Je ne vais pas éditer mon post, la plupart du temps hors de la postérité, cependant, j'ai augmenté votre message, et d'autres lecteurs devraient le lire aussi.:-) –

2

Lien statiquement à la bibliothèque d'exécution C++:

  1. Ouvrir les propriétés du projet.
  2. Accédez à Propriétés de configuration | C/C++ | Section de génération de code.
  3. Définir la bibliothèque d'exécution sur Multi-threaded (/ MT).
+0

Cela ne permet pas de le rendre compatible avec plusieurs versions de MSVC. –

Questions connexes