Question

J'ai un grand corps de code, compilé avec / MT (à savoir attendre à la liaison statique contre le CRT). Je dois combiner avec une bibliothèque tiers statique, qui a été construit avec / MD (à savoir attendre pour relier dynamiquement le CRT).

est-il théoriquement possible de relier les deux en un seul exécutable sans recompilation soit?

Si je lien 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 l'application de ces fonctions dans mon propre code, transmission à wgetenv, etc. Est-ce que la peine d'essayer, ou je rencontrerai directement dans le problème suivant?

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

Était-ce utile?

La solution

Non

. / 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

Autres conseils

J'ai trouvé cette solution dans les sources OpenSSL: Tous les fichiers de la bibliothèque sont compilés avec la combinaison: /MT /Zl . Comme auteur décrit, cette combinaison permet de construire la bibliothèque statique avec la capacité de compiler des applications soit CRT dynamique (/MD) ou CRT statique (/MT).

Je fait face à la même situation où j'ai eu dans deux bibliothèques a été construit avec une MT et un autre avec MD. Je devais construire un exécutable qui utilise des fonctionnalités des deux bibliothèques. La bibliothèque construite comme MD était tiers ainsi je ne pouvais pas reconstruit et bibliothèque construite comme MT a beaucoup de dépendances et de construire tous comme MD est une grande douleur. Je recevais erreur du fichier d'en-tête de configuration tierce partie qui a rendu obligatoire pour construire l'exécutable comme MD. Je cherchais le moyen facile d'emballage dll tiers comme une dll séparée comme mentionné en question. Cependant, je ne pouvais pas trouver une explication suffisante en ligne sur ce chemin facile. D'où mes deux cents ci-dessous. Ce qui suit est la façon dont je circonvenir

  1. Je construit une autre .dll qui a agi comme une interface. Cette interface essentiellement enveloppé tous les appels api qui a été faite à dll tiers. Le fichier d'en-tête pour cette interface ne comporte pas de fichier d'en-tête de dll tiers plutôt tous les fichiers d'en-tête ont été inclus dans le fichier interface.cpp. Interface comme prévu a été construit comme MD.
  2. Dans mon fichier main.cpp j'inclus ce fichier d'en-tête d'interface pour faire tous les appels à dll tiers via l'interface.

  3. Le soin supplémentaire doit être pris en passant des arguments à l'interface. Variables de base comme int, bool etc peuvent être transmis en tant que valeur. Cependant, toute classe ou structure besoins à transmettre comme référence const pour éviter la corruption du tas. Ceci est applicable à la chaîne même.

Heureux de partager plus de détails si on ne sait pas!

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