Question

Dans Visual Studio, il y a les drapeaux de compilation / MD et / MT qui vous permettent de choisir quel type de bibliothèque d'exécution C vous voulez.

Je comprends la différence dans la mise en œuvre, mais je ne suis toujours pas sûr que l'on à utiliser. Quels sont les avantages / inconvénients?

L'un des avantages à / MD que je l'ai entendu, est que cela permet à une personne de mettre à jour le moteur d'exécution, (comme le patch peut-être un problème de sécurité) et mon application va bénéficier de cette mise à jour. Bien que pour moi, cela semble presque comme une non-fonction: Je ne veux pas que les gens changer mon temps d'exécution sans me permettre de tester contre la nouvelle version

Certaines choses que je suis curieux de savoir:

  • Comment cela affectera la construction fois? (Probablement / MT est un peu plus lent?)
  • Quelles sont les autres conséquences?
  • Lequel plupart des gens utilisent?
Était-ce utile?

La solution

En reliant dynamiquement avec / MD,

  • vous êtes exposé à des mises à jour du système (bons ou mauvais),
  • votre exécutable peut être plus petit (car il ne possède pas la bibliothèque intégrée dedans), et
  • Je crois que, à tout le moins le segment de code d'une DLL est partagée entre tous les processus qui l'utilisent activement (en réduisant la quantité totale de RAM consommée).

J'ai aussi constaté que, dans la pratique, lorsque l'on travaille avec statiquement liés 3e partie bibliothèques binaires seulement qui ont été construits avec différentes options d'exécution, / MT dans l'application principale tend à provoquer des conflits beaucoup plus souvent que / MD (parce que vous avez des problèmes si le runtime C est plusieurs fois lié statiquement, surtout si elles sont différentes versions).

Autres conseils

Si vous utilisez DLLs alors vous devriez aller pour le CRT lié dynamiquement (/ MD).

Si vous utilisez le CRT dynamique pour votre .exe et tous les fichiers .dll alors ils partagent tous une seule mise en œuvre du CRT - ce qui signifie qu'ils partagent tous un tas unique CRT et la mémoire allouée dans un .exe / .dll peut être libéré dans un autre.

Si vous utilisez le CRT statique pour votre .exe et tous les fichiers .dll alors ils vont tous obtenir une copie séparée du tube cathodique - ce qui signifie qu'ils utiliseront tout leur tas CRT si la mémoire doit être libéré dans le même module dans laquelle il a été affecté. Vous aussi souffrir de météorisation code (plusieurs copies du CRT) et l'excès de frais généraux d'exécution (chaque tas alloue de la mémoire du système d'exploitation pour garder la trace de son état, et les frais généraux peut être perceptible).

Je crois que la valeur par défaut pour les projets construits par Visual Studio est / MD.

Si vous utilisez / MT, votre exécutable ne dépendra pas d'une DLL être présent sur le système cible. Si vous envelopper cela dans un programme d'installation, il ne sera probablement pas un problème et vous pouvez aller de toute façon.

J'utilise / MT moi-même, afin que je puisse ignorer tout ce gâchis de DLL.

P.S. Comme M. souligne, il est essentiel d'être cohérent. Si vous liez avec d'autres bibliothèques, vous devez utiliser la même option qu'ils font. Si vous utilisez une DLL tierce partie, il est presque certain que vous aurez besoin d'utiliser la version DLL de la bibliothèque d'exécution.

Je préfère lier statiquement avec / MT.

Même si vous obtenez un petit exécutable avec / MD, vous avez encore à expédier un tas de DLL pour vous assurer que l'utilisateur obtient la bonne version pour l'exécution de votre programme. Et à la fin de votre programme d'installation va être plus grand que lors de la liaison avec / MT.

Ce qui est encore pire, si vous choisissez de mettre vos bibliothèques d'exécution dans le répertoire Windows, tôt ou tard, l'utilisateur va installer une nouvelle application avec différentes bibliothèques et, avec toute la malchance, briser votre application.

Le problème que vous courrez dans avec / MD est que la version cible du tube cathodique ne peut pas être sur votre machine de l'utilisateur (en particulier si vous utilisez la dernière version de Visual Studio et l'utilisateur dispose d'un système d'exploitation plus ancien).

Dans ce cas, vous devez savoir comment obtenir la version à droite sur leur machine.

de http://msdn.microsoft.com/ fr-fr / bibliothèque / 2kzt1wy3 (VS.71) .aspx :

  

/ MT Définit _MT afin que les versions spécifiques multithread des routines d'exécution sont sélectionnés à partir des fichiers en-tête standard (.h). Cette option indique également au compilateur de placer le nom de la bibliothèque LIBCMT.lib dans le fichier .obj de sorte que l'éditeur de liens utilise LIBCMT.lib pour résoudre les symboles externes. Soit / MT ou / MD (ou leurs équivalents de débogage / ou MTd / MDd) est nécessaire pour créer des programmes multithread.

     

/ MD Définit _MT et _DLL afin que les deux versions multithread- et spécifiques DLL des routines d'exécution sont sélectionnés à partir des fichiers standards .h. Cette option indique également au compilateur de placer le nom de la bibliothèque MSVCRT.lib dans le fichier obj.

     

Les applications compilées avec cette option sont liés statiquement à MSVCRT.lib. Cette bibliothèque fournit une couche de code qui permet à l'éditeur de liens pour résoudre les références externes. Le code de travail réel est contenu dans MSVCR71.DLL, qui doit être disponible au moment de l'exécution d'applications liées à MSVCRT.lib.

     

/ MD est utilisé avec _STATIC_CPPLIB défini (/ D_STATIC_CPPLIB), il entraînera l'application d'un lien avec le multithread statique bibliothèque standard C ++ (de libcpmt.lib) au lieu de la version dynamique (MSVCPRT.lib) tout en reliant dynamiquement à la CRT principal via msvcrt.lib.

Donc, si je l'interprète correctement puis / MT liens statiquement et / MD liens dynamiquement.

Si vous construisez exécutable qui utilise d'autres DLL ou libs option que / MD est préférable car de cette manière tous les composants partageront même bibliothèque. Bien sûr, cette option doit correspondre à tous les modules concernés dll i.e. / lib / exe.

Si votre exécutable n'utilise pas lib ou dll que l'appel de son personne. La différence est pas trop maintenant parce que l'aspect de partage ne sont pas en jeu.

Alors peut-être que vous pouvez lancer l'application avec / MT car il n'y a aucune raison impérieuse autrement, mais quand il est temps d'ajouter un lib ou dll, vous pouvez le remplacer par / MD avec celle de la lib / dll qui est facile.

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