Comment créer un fichier .exe entièrement lié statiquement avec Visual Studio Express 2005 ?

StackOverflow https://stackoverflow.com/questions/37398

  •  09-06-2019
  •  | 
  •  

Question

Mon environnement C++ préféré actuel est l'édition gratuite et largement excellente de Microsoft Visual Studio 2005 Express.De temps en temps, j'ai envoyé des fichiers .exe à d'autres personnes avec des résultats satisfaisants.Cependant, j'ai récemment fait la découverte troublante que les résultats satisfaisants étaient basés sur plus de chance que je souhaiterais.Tenter d'exécuter l'un de ces programmes sur une ancienne boîte XP (millésime 2001, pas scrupuleusement mise à jour) ne m'a donné rien d'autre qu'un méchant message "Le système ne peut pas exécuter x.exe" (ou similaire).

Certaines recherches sur Google ont révélé qu'avec cet ensemble d'outils, même la spécification de liaisons statiques aboutissait à un simple hello-world.exe reposant en fait sur des fichiers .dll supplémentaires (msvcm80.dll, etc.).Un système de schématisation de versions incroyablement élaboré (fichiers manifestes, ça vous tente ?) ne laissera alors pas le .exe s'exécuter sans exactement les bonnes versions .dll.Je ne veux pas ou n'ai pas besoin de ce genre de choses, je veux juste un .exe autonome à l'ancienne qui ne fait rien d'autre que les opérations Win32 du plus petit dénominateur commun et s'exécute sur n'importe quel ancien système d'exploitation Win32.

Est-ce que quelqu'un sait s'il est possible de faire ce que je veux faire avec mon ensemble d'outils existant ?

Merci.

Était-ce utile?

La solution

Pour le runtime C, accédez aux paramètres du projet, choisissez C/C++ puis « Génération de code ».Modifiez le paramètre « bibliothèque d'exécution » en « multithread » au lieu de « dll multithread ».

Si vous utilisez d'autres bibliothèques, vous devrez peut-être indiquer à l'éditeur de liens d'ignorer explicitement le CRT lié dynamiquement.

Autres conseils

Mon expérience dans Visual Studio 2010 est que deux modifications sont nécessaires pour ne pas avoir besoin de DLL.Depuis la page de propriétés du projet (clic droit sur le nom du projet dans la fenêtre de l'Explorateur de solutions) :

  1. Sous Propriétés de configuration --> Général, remplacez le champ « Utilisation de MFC » par « Utiliser MFC dans une bibliothèque statique ».

  2. Sous Propriétés de configuration --> C/C++ --> Génération de code, remplacez le champ "Runtime Library" par "Multi-Threaded (/MT)".

Je ne sais pas pourquoi les deux étaient nécessaires.J'ai utilisé cela pour supprimer une dépendance sur glut32.dll.

Ajouté plus tard :Lorsque vous apportez ces modifications aux configurations, vous devez les apporter à "Toutes les configurations" --- vous pouvez sélectionner cette option en haut de la fenêtre Propriétés.Si vous apportez la modification uniquement à la configuration Debug, elle ne s'appliquera pas à la configuration Release, et vice-versa.

J'ai eu ce même problème de dépendance et je sais aussi que vous pouvez inclure les DLL VS 8.0 (version uniquement !pas de débogage ! --- et votre programme doit également être publié) dans un dossier du nom approprié, dans le dossier parent avec votre .exe :

Comment:Déployer à l'aide de XCopy (MSDN)

Notez également que les choses sont garanties de mal tourner si vous avez besoin d'avoir du code C++ et C dans le même .exe lié statiquement, car vous obtiendrez des conflits d'éditeur de liens qui ne peuvent être résolus qu'en ignorant le libXXX.lib correct, puis en liant dynamiquement (DLL). .

Enfin, avec un ensemble d'outils différent (VC++ 6.0), les choses "fonctionnent", puisque Windows 2000 et supérieur ont les DLL appropriées installées.

En ce qui concerne la réponse de Jared, avoir Windows 2000 ou une version ultérieure ne résoudra pas nécessairement le problème en question.La réponse de Rob fonctionne, mais il est possible que ce correctif introduise des problèmes de sécurité, car les mises à jour Windows ne pourront pas corriger les applications conçues comme telles.

Dans un autre article, Nick Guerrera suggère d'emballer le Visual C++ Runtime Redistributable avec vos applications, qui s'installe rapidement et est indépendant de Visual Studio.

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