121 votes

Dois-je compiler avec / MD ou / MT?

Dans Visual Studio, il y a le compiler flags /MD et /MT qui vous permettent de choisir le type de bibliothèque runtime C vous le souhaitez.

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

Un avantage de l' /MD que j'ai entendu, c'est que cela permet à quelqu'un de mettre à jour le moteur d'exécution, (comme le patch peut-être un problème de sécurité) et mon application qui va bénéficier de cette mise à jour. Bien que pour moi, c'est presque comme une non-fonctionnalité: je ne veux pas que les gens de changer mon moteur d'exécution sans me permettre de tester la nouvelle version!

Certaines choses que je suis curieux de savoir:

  • Comment cela affecterait-il les temps de construire? (probablement /MT est un peu plus lent?)
  • Quelles sont les autres conséquences?
  • Quel est celui que la plupart des gens utilisent?

81voto

Mr Fooz Points 21092

En reliant dynamiquement avec /MD,

  • vous êtes exposé à des mises à jour du système (en bien ou en mal),
  • votre exécutable peut être plus petit (car elle n'a pas la bibliothèque intégré dans celui-ci), et
  • Je crois que c'est au moins le segment de code d'une DLL est partagé entre tous les processus qui utilisent activement (réduction de la quantité totale de RAM consommée).

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

31voto

Joe Gauterin Points 9526

Si vous utilisez Dll alors vous devriez aller pour la liée de façon dynamique CRT (/MD).

Si vous utilisez le CRT dynamique pour votre .exe et tous .dll ensuite, ils partagent tous un unique de mise en œuvre de la CGT - qui signifie qu'ils ont tous un même tas CRT et de la mémoire allouée dans un .exe/.dll peut être libéré dans l'autre.

Si vous utilisez le CRT statique pour votre .exe et tous .dll puis ils vont tous obtenir une autre copie de la CGT - qui veut dire qu'ils vont tous utiliser leur propre tas CRT ainsi, la mémoire doit être libéré dans le même module dans lequel il a été affecté. Vous aurez également souffrir de l'augmentation du code (plusieurs copies de la CRT) et l'excédent de gestion d'exécution (chaque tas alloue de la mémoire à partir de l'OS afin de garder une trace de son état, et les frais généraux peuvent être visibles).

18voto

Mark Ransom Points 132545

Je crois que la valeur par défaut pour les projets réalisés par le biais de Visual Studio est /MD.

Si vous utilisez /MT, votre exécutable ne dépendra pas d'une DLL d'être présent sur le système cible. Si vous êtes d'emballage, 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, afin que je puisse ignorer l'ensemble de la DLL mess.

P. S. M. Fooz , il est essentiel d'être cohérent. Si vous êtes le lien avec d'autres bibliothèques, vous devez utiliser la même option qu'ils font. Si vous êtes à l'aide d'un tiers DLL, il est presque certain que vous aurez besoin d'utiliser la DLL de la version de la bibliothèque d'exécution.

14voto

Adrian Grigore Points 15993

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

Même si vous obtenez un petit fichier exécutable avec /MD, vous avez encore d'expédier un tas de Dll afin de s'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 votre runtime des bibliothèques dans le répertoire windows, tôt ou tard, l'utilisateur va installer une nouvelle application avec différentes bibliothèques et, avec de la malchance, de la rupture de votre application.

8voto

jeffamaphone Points 31732

Le problème que vous rencontrerez avec / MD est que la version cible du CRT peut ne pas être sur la machine de vos utilisateurs (surtout si vous utilisez la dernière version de Visual Studio et que l'utilisateur dispose d'un système d'exploitation plus ancien).

Dans ce cas, vous devez trouver comment obtenir la bonne version sur leur machine.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X