Question

J'essaie de créer une bibliothèque c ++ à utiliser sur Windows / MSVC.

Mon problème est qu’il me semble que pour lier correctement, j’ai besoin de distribuer un grand nombre de versions différentes, liées à différentes versions des environnements d’exécution c ++ de MSVC: mono et multi-threads, débogage et édition, différentes versions du compilateur, différentes versions. autres options de sécurité et autres.

J'aimerais juste distribuer peut-être deux, 32 et 64 bits.

Mon idée est peut-être d'utiliser un nouvel opérateur différent (par exemple, mon nouveau) et des allocateurs personnalisés pour tous mes types de STL. Lors de la création de la bibliothèque, / nodefaultlib. Ensuite, lorsqu’ils sont liés à partir d’un projet parent, demandez-leur de définir mynew to new, et mon stl allocator au standard (ou à l’un de leur choix). Je suppose que je devrais faire supprimer, et quelques autres fonctions. Naturellement, je donnerais un exemple d'implémentation judicieuse avec la bibliothèque, mais nous espérons que cela épargnera à tout le monde beaucoup de maux de tête.

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

Était-ce utile?

La solution

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

Note rapide sur la réponse de Chris (vous ne voulez pas ralentir, c'est surtout bon, mais ...):

NE PAS créer de lien vers msvcrt.dll (le fichier non versionné); Il s'agit de la version DLL spécifique au système d'exploitation. Si vous y créez un lien, votre application ne fonctionnera probablement pas sur les autres versions de Windows. Vous devriez toujours faire un lien vers msvcrt ##. Dll, pour autant que je sache. Le DDK peut contenir une bibliothèque, mais ne vous y connectez pas, sauf si vous savez vraiment ce que vous faites.

Autres conseils

Liaison statique à la bibliothèque d'exécution C ++:

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

Vous n'avez pas besoin d'utiliser un allocateur personnalisé si vous utilisez C ++ et encapsulez toutes les allocations autour de std :: tr1 :: shared_ptr (où vous pouvez spécifier une fonction de désallocation). Ainsi, même lorsque les clients publient la dernière référence au pointeur partagé, il reste du code dans votre bibliothèque (ou son tube cathodique) qui est appelé lors de la libération de l'objet.

C’est un moyen de résoudre "l'enfer des limites de DLL". J'espère que ça aide! : -)

Edit: Je pense avoir mal interprété l’intention de votre question. Plutôt que de ne vouloir aucune dépendance sur un tube cathodique parce que vous vous inquiétez de l'enfer des limites de DLL, je suppose que vous vouliez simplement une version de votre DLL que vous pouvez installer n'importe où. Dans ce cas, vous pouvez associer votre programme à msvcrt.dll . C'est disponible sur n'importe quel système Windows.

Vous ne l'avez pas entendu dire de moi, mais apparemment, dans le kit de développement de pilotes, vous pouvez trouver une sorte de bibliothèque d'importation permettant aux nouvelles versions de Visual Studio de créer un lien vers msvcrt .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top