web-dev-qa-db-fra.com

Pourquoi mon application nécessite-t-elle un package redistribuable Visual C ++

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 lorsque j'installe cette application sur la machine de l'utilisateur, elle nécessite Visual C++ Redistributable Package. Je me demande pourquoi ma candidature nécessite C++ Redistributable? La norme C++ La bibliothèque d'exécution est livrée avec Windows, n'est-ce pas?

46
JeB

La version uniquement de la bibliothèque d'exécution C fournie par Microsoft avec la plupart des versions Windows 32 bits est msvcrt.dll. Cette bibliothèque fournit un ensemble typique de fonctions de bibliothèque requises par les programmes C et C++. Ceux-ci incluent la manipulation de chaînes, l'allocation de mémoire, les appels d'entrée/sortie de style C, etc.

Le compilateur de Visual Studio 6.0 établit un lien avec cette bibliothèque, donc si vous développez dans VS 6.0, vous ne devriez rencontrer aucun problème sur la plupart des machines des utilisateurs.

Cependant, si vous développez dans VS 2005, VS 2008, VS 2010, VS 2012, VS 2013 ou VS 2015, vous devez distribuer des bibliothèques d'exécution C supplémentaires avec votre application. En effet, leurs compilateurs se lient à msvcrt80.dll, msvcrt90.dll, msvcrt100.dll, msvcrt110.dll, msvcrt120.dll et msvcrt140.dll respectivement, qui ne sont pas fournis avec Windows.

Solutions:

  1. La solution possible consiste à créer un lien statique avec la bibliothèque d'exécution, mais cela peut entraîner de nombreux problèmes si vous disposez des deux .exe et .dll dans votre candidature. Ne faites pas cela .

    Pour être plus précis, je vais me permettre de citer une partie de this answer:

    L'utilisation de/MT est risquée si vous créez des DLL ainsi qu'un EXE. Vous vous retrouverez avec plusieurs copies du CRT dans votre programme. C'était particulièrement un problème avec les versions antérieures de VS où chaque CRT obtiendrait son propre tas, pas tellement avec VS2012. Mais vous pouvez toujours avoir de vilains problèmes d'exécution lorsque vous avez plus d'une variable "errno" par exemple. L'utilisation de/MD est fortement recommandée pour éviter de telles pertes.

  2. Une autre solution possible consiste à exiger qu'un package Microsoft Visual C++ Redistributable approprié soit installé sur la machine de l'utilisateur.

    Cela peut être fait en spécifiant cette exigence dans la propriété des prérequis de votre projet d'installation.

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

  4. Enfin, vous pouvez simplement placer les DLL requises dans le même dossier dans lequel votre application est installée.

Lectures complémentaires:

53
JeB

Même si certains commentaires ont dit que "lier statiquement à la bibliothèque d'exécution, mais cela peut causer beaucoup de problèmes lorsque vous avez à la fois .exe et .dll dans votre application." Ce n'est PAS VRAI. D'abord, nous ne lions PAS statiquement les DLL! Nous lions statiquement les OBJ et les LIB. Les LIB sont des bibliothèques statiques; Les DLL sont des bibliothèques dynamiques et vous pouvez choisir d'utiliser des LIB (statiques) ou des DLL (dynamiques). C'est à vous de choisir. L'inconvénient UNIQUEMENT (pour les fans de DLL) est que si vous souhaitez mettre à jour une bibliothèque, vous devez compiler et lier à nouveau. Je déploie personnellement TOUS mes logiciels liés statiquement et à cause de cela je gagne l'avantage de ne même pas avoir besoin d'installateurs. Le logiciel que je développe est 100% portable (une fonctionnalité qui à l'époque du pré-installateur était une procédure générale), et l'utilisateur final est libre de copier simplement d'un dossier à un autre ou même de du disque dur au lecteur flash (ou vice versa). Le message d'erreur "DLL introuvable." n'existe tout simplement pas ... JAMAIS.

Certaines personnes pensent que les liens statiques sont des logiciels de jouets: FAUX! Je peux écrire une application complète qui se connecte à un SGBD (Oracle, SQL Server, ...) ou à tout autre type d'application.

7
user4377425