2010-08-12 22 views
6

J'ai un grand corps de code, compilé avec/MT (c'est-à-dire s'attendant à un lien statique avec le CRT). J'ai besoin de combiner cela avec une bibliothèque tierce statique, qui a été construite avec/MD (c'est-à-dire en attendant de lier dynamiquement le CRT).code de mélange compilé avec/MT et/MD

Est-il théoriquement possible de lier les deux dans un exécutable sans recompiler?

Si je lie avec/nodefaultlib: msvcrt, je me retrouve avec un petit nombre de références non définies à des choses comme __imp__wgetenv. Je suis tenté d'essayer d'implémenter ces fonctions dans mon propre code, en les transférant à wgetenv, etc. Est-ce que cela vaut la peine d'essayer, ou vais-je courir directement dans le prochain problème?

Malheureusement, je suis interdit de prendre l'option facile d'emballer le code thirdparty dans une DLL séparée: -/

Répondre

3

No./MT et/MD sont mutuellement exclusifs.

Tous les modules passés à un appel donné de l'éditeur de liens doit avoir été compilé avec la même option de compilateur bibliothèque d'exécution (/MD, /MT, /LD).

Source

+0

Pas la réponse que j'espérais, mais merci ;-) – slowdog

0

Je trouve cette solution dans les sources OpenSSL: Tous les fichiers OBJ de la bibliothèque sont compilés avec la combinaison: /MT/Zl. Comme décrit par l'auteur, une telle combinaison permet de construire une bibliothèque statique avec la possibilité de compiler avec des applications CRT dynamiques (/MD) ou CRT statique (/MT).

0

J'ai fait face à une situation similaire où j'ai eu deux bibliothèques l'une a été construite avec MT et l'autre avec MD. J'ai dû construire un exécutable qui utilise les fonctionnalités des deux bibliothèques. La bibliothèque construite comme MD était une tierce partie donc je ne pouvais pas la reconstruire et la bibliothèque construite comme MT a beaucoup de dépendances et les construire tous comme MD est une grande souffrance. J'obtenais une erreur du fichier d'en-tête de configuration tiers qui l'obligeait à construire l'exécutable en tant que MD. Je cherchais le moyen facile d'empaquetage dll tiers comme une DLL séparée comme mentionné dans la question. Cependant, je n'ai pas trouvé assez d'explications en ligne sur cette façon simple. D'où mes deux cents ci-dessous. Ce qui suit est la façon dont je contournent

  1. je construit une autre .dll qui a agi comme une interface. Cette interface fondamentalement enveloppé tous les appels API qui a été faite à une tierce partie dll. Le fichier d'en-tête de cette interface n'incluait aucun fichier d'en-tête provenant d'une DLL tierce, mais tous ces fichiers d'en-tête étaient inclus dans le fichier interface.cpp. Interface comme vous vous attendez a été construit comme MD.
  2. Maintenant Dans mon fichier main.cpp j'ai inclus ce fichier d'en-tête d'interface pour faire tous les appels à une DLL tierce via l'interface.

  3. Des précautions supplémentaires doivent être prises lors de la transmission d'arguments à l'interface. Les variables de base comme int, bool etc peuvent être passées en valeur. Cependant, toute classe ou structure doit être transmise en tant que référence const pour éviter la corruption du tas. Ceci est applicable à la chaîne paire.

Heureux de partager plus de détails si ce n'est pas clair!