web-dev-qa-db-fra.com

Compiler C++ dans VS sans nécessiter MSVCP120D.dll au moment de l'exécution

J'essaie de créer un binaire pouvant être exécuté sur n'importe quelle machine Windows sans les éléments visuels c ++ installés (je suppose que c'est ce qu'est MSVCP120D.dll, mais ma recherche n'a pas été très fructueuse quant à sa nature réelle). J'ai fait un jeu pour une mission et je voulais avoir d'autres personnes (non-devs sans matériel VS installé), aidez-moi à le tester mais ils n'arrêtaient pas de recevoir des erreurs disant que la DLL ci-dessus est manquante. Je n'utilise aucun élément Visual C++ et l'indicateur/Za est défini pour garantir qu'il ne s'agit que d'ANSI C++. Visual Studio prend-il en charge la compilation ANSI C++ et si oui, comment puis-je éviter de l'utiliser, quel compilateur dois-je utiliser?

12
dlkulp

Comme vous pouvez le constater ici , MSVCP DLL est l’implémentation de la plate-forme de la bibliothèque standard C++. En bref, cela signifie que vous ne pouvez pas distribuer votre application sans avoir besoin des «éléments» fournis par ces bibliothèques. Tous les compilateurs, quelle que soit la plate-forme, auraient besoin d'une sorte d'implémentation de la bibliothèque standard. En règle générale, cela est distribué sous la forme de bibliothèques.

Cependant, vous pouvez distribuer votre application de manière à ce que le "matériel" soit directement intégré à votre programme, plutôt que d'être fourni dans une DLL distincte. Pour ce faire, vous devez lier statiquement votre application à la bibliothèque standard.

Il y a plusieurs façons d'accomplir cela. Une façon est dans les paramètres du projet. Dans "Projet"> "Propriétés de configuration"> "Génération de code C/C++"> "Bibliothèque d'exécution", choisissez "Multithread (/ MT)" par opposition à "Mutithread (Statique)".


Par ailleurs, le "D" dans "MSVCP120D.dll" que vous avez mentionné ci-dessus signifie "Debug". Cela signifie que vous essayez de distribuer une version debug de votre programme. Vous devriez (presque) ne jamais faire cela. Distribuez les versions release à la place.

15
John Dibling

Vous avez trois options (dans l'ordre que je recommanderais):

  1. Ne créez pas de lien statique, mais demandez à ceux qui veulent utiliser votre jeu d'installer le package redistribuable Visual Studio. Version VC 32 bits 2010 ici: http://www.Microsoft.com/en-us/download/details.aspx?id=5555

  2. Liez statiquement le CRT (la dll dont vous ne voulez pas avoir besoin à l'exécution). Pour plus de détails, voir ici: Comment créer un fichier .exe entièrement lié de manière statique avec Visual Studio Express 2005?

  3. Construisez une application qui n'utilise même pas le tube cathodique. Ici, vous devrez implémenter votre propre opérateur qui appelle HeapAlloc (), et l'opérateur delete qui appelle HeapFree (), c'est un défi intéressant;). Pour ce faire, vous dites à l'éditeur de liens d'ignorer toutes les bibliothèques par défaut.

5
paulm

Construisez avec les bibliothèques d'exécution statiques plutôt que les versions DLL.

Accédez à Propriétés, C/C++, Génération de code, Bibliothèque d'exécution et sélectionnez/MTd ou/MT plutôt que les options/MDd et/MD.

3
Len Holgate

Configurez votre projet pour qu'il soit lié au runtime de manière statique plutôt que dynamique. 

1
David Heffernan

Tout d'abord, le D à la fin du nom indique une construction de débogage. Si vous créez une version, vous en aurez besoin sans D. Cela est important car Microsoft ne permet pas aux bibliothèques de débogage d'être distribuées sans visual studio.

La machine sur laquelle vous essayez d'exécuter le programme peut déjà avoir le runtime de version installé car de nombreux programmes l'utilisent. Sinon, installez http://www.Microsoft.com/en-us/download/details.aspx?id=30679 sur la machine (je pense que c'est la bonne, mais je ne peux pas vérifier pour le moment)

1
jcoder

J'ai rencontré cette erreur lorsque j'ai essayé d'exécuter mon fichier exe sur un autre ordinateur doté d'une version plus récente de Visual Studio. Vous devez modifier les propriétés du projet et recompiler pour que cela disparaisse. 

Pour faire ça:

  1. Ouvrez la solution que vous essayez d'exécuter
  2. Faites un clic droit sur le fichier de projet -> Propriétés
  3. Dans Propriétés de configuration et Général, assurez-vous que Platform Toolset est configuré pour être le compilateur correct sur votre ordinateur. Si ce n'est pas correct, il devrait afficher à côté de lui un message l'informant qu'il n'est pas installé. 
  4. Générez et exécutez le code à nouveau et vous ne devriez plus obtenir le problème.
0
Christopher Settles

Vous voudrez une liaison statique , qui "intègre" les appels de bibliothèque externes dans votre binaire. Cela a l'effet ajouté d'un fichier binaire plus volumineux, mais dans votre cas, cela ne semble pas être une grosse affaire.

Sur une note de côté, MSVCP120D.dll est le Microsoft Visual C++ 12 debug DLL (bibliothèque de liens dynamiques) qui contient toutes les bibliothèques C++ de débogage (c'est-à-dire iostream, string, etc.). Cette bibliothèque est ce que vous «feriez» dans votre binaire final.

J'espère que cela pourra aider.

0
txtechhelp