2011-11-21 3 views
11
  1. Quel est le but de la 'msvcr XXX .dll' et 'msvcp XXX .dll? Et quelles sont les différences entre msvc r et msvc p?
  2. Pourquoi ai-je besoin de les lier à mon binaire si c'est juste un .dll très simple et non managé? Est-ce parce que cela fait partie de l'éditeur de liens? Pourquoi n'est-il pas dans le répertoire système Windows par défaut en tant que bibliothèque commune?

J'essaie simplement de comprendre pourquoi dans Windows il y a somethings si compliqué ....Pourquoi ai-je besoin d'un paquet redistribuable sur du code non managé? (Msvcp100.dll)

Répondre

27

msvcrXXXX.dll est la DLL pour la bibliothèque d'exécution C. msvcpXXXX.dll est la DLL de la bibliothèque d'exécution C++.

L'une de ces dépendances ou les deux seront ajoutées à votre fichier binaire si vous générez à l'aide de/MD ou de/MDd, qui sont les valeurs par défaut spécifiées par Visual Studio lorsque vous créez un nouveau projet C++. L'utilisation de l'un de ces indicateurs indique que vous voulez que votre programme soit lié à la version DLL de l'environnement d'exécution C/C++. Vous pouvez modifier les paramètres par défaut sous Propriétés du projet-> Propriétés de configuration-> C/C++/Génération de code/Bibliothèque d'exécution.

Si vous modifiez votre projet pour utiliser/MT ou/MTd, votre application ne générera aucune référence à l'une des DLL listées ci-dessus, car les runtimes C/C++ seront directement liés à votre programme. Pour la plupart des programmes simples, cela ne causera aucun problème. Cependant, si votre programme est divisé en plusieurs DLL construites à l'aide de ces indicateurs, chaque DLL conservera une copie des fonctions CRT référencées et des données statiques, et vous risquez de rencontrer des problèmes d'allocation/libération de mémoire. Pour les éviter, vous devez vous assurer que les objets alloués dans une DLL donnée sont également libérés dans ce même module.

En général, il est plus efficace d'utiliser les indicateurs/MDD/MDd pour les applications qui ont plusieurs modules (DLL), car tous ces modules partageront une seule copie des bibliothèques d'exécution C/C++ et leurs structures de données dans le processus de demande.

Pour des applications simples à module unique, cependant, n'hésitez pas à créer en utilisant/MT ou/MTd.

+1

Bonne explication. –

Questions connexes