Pourquoi mon application nécessite Visual C++ redistribuable package

j'écris un simple C++ application dans Visual Studio. Il a également un projet d'installation. Cela fonctionne bien sur ma machine de développement, mais quand j'installe cette application sur la machine de l'utilisateur il faut Visual C++ Redistributable Package. Je me demande Pourquoi ma demande nécessite C++ Redistributable? Standard C++ la bibliothèque runtime est livrée avec Windows, n'est-ce pas?

45
demandé sur meltedspark 2013-04-23 14:42:49

2 réponses

la version de la bibliothèque C runtime qui est livrée par Microsoft avec la plupart des versions 32 bits de Windows est msvcrt.dll. Cette bibliothèque fournit un ensemble typique de fonctions de bibliothèque requises par les programmes C et C++. Il s'agit notamment de la manipulation des chaînes de caractères, de l'attribution de la mémoire, des appels d'entrée/sortie de style C, etc.

les liens du compilateur Visual Studio 6.0 avec cette bibliothèque, donc si vous développez en VS 6.0 vous ne devriez pas rencontrer de problèmes sur la plupart des utilisateurs machine.

cependant, si vous développez en VS 2005, VS 2008, VS 2010, VS 2012, VS 2013 ou VS 2015, vous devez distribuer des bibliothèques supplémentaires C runtime avec votre application. C'est parce que leurs compilateurs lien contre msvcrt80.dll,msvcrt90.dll, msvcrt100.dll,msvcrt110.dll,msvcrt120.dll et msvcrt140.dll respectivement, qui ne sont pas livrés avec Windows.

Solutions:

  1. solution Possible est de lier statiquement avec la bibliothèque d'exécution, mais il peut causer beaucoup de problèmes dans le cas où vous avez à la fois .exe et .dll dans votre demande. Ne pas le faire.

    pour être plus précis, je me permettrai de citer une partie de réponse:

    utiliser /MT est risqué si vous créez des DLLs aussi bien qu'un EXE. Vous finirez avec plusieurs copies du CRT dans votre programme. C'était surtout un problème avec les versions précédentes de VS où chaque CRT aurait ses propres tas, pas tellement avec VS2012. Mais tu peux quand même avoir un mauvais runtime problèmes lorsque vous avez plus d'une variable" errno " par exemple. Il est fortement recommandé d'utiliser /MD pour éviter de telles pertes.

  2. une autre solution possible est d'exiger un paquet Redistribuable Visual C++ Microsoft approprié à installer sur la machine de l'utilisateur.

    cela peut être fait en spécifiant cette exigence dans la propriété des prérequis de votre configuration projet.

  3. aussi, vous pouvez distribuer le runtime dll en incluant dans votre projet d'installation "module de fusion". Dans ce cas, n'oubliez pas d'ajouter le "module de fusion de politique" approprié pour éviter les erreurs causées par une version d'exécution incorrecte.

  4. enfin, vous pouvez simplement mettre les DLLs nécessaires dans le même dossier dans lequel votre application est installée.

autres lecture:

52
répondu meltedspark 2018-02-25 09:46:09

même si certains commentaires disent que " lien statique avec la bibliothèque runtime, mais cela peut causer beaucoup de problèmes quand vous avez les deux .exe et .dll dans votre application."ce n'est PAS VRAI. D'abord, nous ne lions pas statiquement les DLLs! Nous lions statiquement OBJs et LIBs. Les LIBs sont des bibliothèques statiques; les DLLs sont des bibliothèques dynamiques, et vous pouvez choisir D'utiliser les LIBs (static) ou les DLLs (dynamic). C'est entièrement à vous de choisir. Le seul inconvénient (pour les ventilateurs DLL) est que si vous voulez mettre à jour une bibliothèque, vous besoin pour compiler et lier de nouveau. Je déploie personnellement tous mes logiciels static linked et pour cette raison je gagne le bonus de n'ai même pas besoin d'installateurs. Le logiciel que j'ai développé est 100% portable (une fonctionnalité qui à l'époque pré-installateur était la procédure générale), et l'utilisateur final est libre à la copie simple d'un dossier à l'autre ou même du disque dur à lecteur flash (ou vice-versa). Le message d'erreur "DLL non trouvé."n'existe tout simplement pas ... JAMAIS.

Certaines personnes pensent de liaison statique en tant que logiciel jouet: faux! Je peux écrire une application complète qui se connecte à un SGBD (Oracle, SQL Server,...) ou de tout autre type d'application.

6
répondu user4377425 2014-12-19 09:59:57