Question

Cela fait longtemps que je n'ai pas utilisé vs 2010 et c ++, et comme je recommence à l'utiliser, je rencontre les mêmes problèmes qui m'ont tourmenté l'année dernière: les exe que je compile ne fonctionnent pas bien sur Les machines plus anciennes qui n'ont pas les temps C ++ corrects. Je ne sais même pas quel lien leur donner, et je leur ai dit d'installer cette Après avoir eu une erreur qui disait "Le programme ne peut pas démarrer car MSVCR100.DLL est absent de votre ordinateur. Essayez de réinstaller le programme pour résoudre ce problème. Cliquez sur OK pour fermer l'application."). Je suis donc entré et j'ai réglé la génération de code sur / mt et j'ai désactivé pas mal d'options, et j'ai essayé de jouer avec beaucoup d'options, mais toujours le même résultat.

Ma question est: existe-t-il une liste de distribules complets VS 2010 C ++ que je peux simplement leur donner et leur dire d'installer afin que tous les programmes C ++ que je compilent sur mon VS 2010 fonctionneront sur Windows XP, ou même mieux, un moyen de général Un exe autonome qui contient tout ce dont il a besoin pour fonctionner et ne s'appuie pas sur les DLL? Je pense que comme un lien vers une bibliothèque qui a tout ce que l'EXE fait référence. Si cela aide, je construis à la fois pour X64 et X86.

PS Qu'est-ce qui se passe avec le fichier manifeste, dois-je l'inclure ou non?

Était-ce utile?

La solution

La chose la plus simple à faire est d'installer simplement le package redistribuable VC ++. Il a les deux x86 et x64 versions.

Autres conseils

Tout d'abord, avant de vous donner le détail:


Avertissement

Si vous faites cela, les choses seront mauvaises pour deux raisons:

  1. S'il y a une sécurité ou d'autres bogues dans les temps d'exécution MSVC et que vous adoptez cette approche, ils sont cuits dans votre application, ce qui signifie que vous devez redistribuer. Les DLL sont préférées parce que théoriquement les gens utilisation Mise à jour du système, ce qui signifie que toutes les erreurs sont corrigées.
  2. Tout ce que vous compilez dans votre EXE doit également le faire. Si vous ne le faites pas, vous vous retrouvez avec deux versions du code et tout ce que vous utilisez ne vous lit pas.

Une solution possible consiste à préparer le runtime MSVC dans votre application, en utilisant le cl.exe Option (paramètres du compilateur C / C ++) /MT Ce qui signifie la version multithread du C / C ++ lié statiquement. Comme je l'ai dit, si vous essayez de vous connecter à quelque chose qui est lié dynamiquement à l'exécution, vous allez vous retrouver dans un gâchis. De plus, comme je l'ai dit, cela représente un facteur de risque de sécurité supplémentaire, alors gardez cela à l'esprit.

Les autres options consistent à écrire un installateur qui peut soit télécharger l'exécution appropriée, soit inclure la DLL nécessaire.

Si vous utilisez une fonctionnalité de l'exécution qui dépasse une certaine version de Windows (instruction générique, mais cela se produit), vous devriez pouvoir utiliser le SDK Windows pour cibler diverses versions de Windows en utilisant des temps C appropriés.

http://www.microsoft.com/downloads/en/details.aspx?familyid=a7b7a05e-6de6-4d3a-a423-37bf0912db84

Texte Google: Visual Studio C ++ Redis

Ne liez pas statiquement à l'exécution; Plus précisément, ne le faites pas si vous utilisez un type de DLL à d'autres fins. Il introduit toutes sortes de problèmes de faux problème de tas de tas avec lesquels vous ne voulez probablement pas jouer.

Ouvrez la boîte de dialogue Propriétés pour votre projet et sélectionnez Propriétés de configuration | C / C ++ | Génération de code. Le paramètre par défaut est la DLL multi-thread. Changez cela en multi-thread et vous construirez et.

Si vous utilisez MFC ou ATL, vous devrez naviguer vers les propriétés de configuration | Général et définir "Utilisation de MFC" ou "Utilisation d'ATL" pour lier également statiquement.

NB: Si vous liez le runtime statiquement, vous devez vous assurer que toute autre bibliothèque dans laquelle vous liez le relie également dans statique. Sinon, vous vous retrouverez avec deux copies de l'exécution en mémoire, chacune avec son propre tas et ses mauvaises choses se produiront lorsque le code utilisant un runtime essaie de libérer un objet alloué par l'autre runtime.

Cette réponse précédente devrait être vrai pour VS2010. Je construis toujours avec VS2005, mais toutes mes applications utilisent le CRT statique pour la seule raison de pouvoir traverser des machines anciennes et plus récentes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top