2008-08-06 23 views
31

Je me demande comment faire une version de compilation qui inclut tous les fichiers dll nécessaires dans le fichier .exe afin que le programme puisse être exécuté sur une machine non-développement sans avoir à installer le microsoft redistribuable sur la machine cible. Sans cela, vous obtenez le message d'erreur indiquant que la configuration de l'application n'est pas correcte et que vous devez réinstaller.Comment emballez-vous un projet Visual Studio C++ pour publication?

+0

Inno Setup en particulier est vraiment facile à utiliser si tout ce dont vous avez besoin est d'emballer un tas de fichiers. – sashoalm

Répondre

17
  1. Choisissez Projet -> Propriétés
  2. Sélectionnez Configuration -> Général
  3. Dans la zone pour la façon dont vous devez lier MFC, choisir de lier statiquement.
  4. Choisissez lieur -> Entrée. Sous dépendances supplémentaires, ajoutez les bibliothèques dont vous avez besoin pour votre application lien statiquement.
+3

Je pourrais manquer quelque chose (je ne suis rien d'un expert) mais après avoir suivi vos pas, je dois encore empaqueter tous les fichiers * dll * dans le dossier * exe *. N'était-ce pas l'intention de OP d'avoir tout emballé dans le fichier * exe *? – Malabarba

+0

@BruceConnor.La liaison statique des bibliothèques les inclut dans le fichier exécutable. Le contraire est appelé liaison dynamique qui permettrait à l'exécutable de rechercher 'dll's (= bibliothèque de liens dunamic) au démarrage. – danijar

0

Vous souhaitez chercher à lien statique (par opposition à lier dynamiquement)

Je ne sais pas combien de MS redistribuables lien statiquement.

0

Si vous cherchez à savoir qui dll est votre machine cible est manquant puis utilisez depends.exe qui était livré avec MSDev, mais peut également être trouvé here. Tester cela sur quelques machines cibles devrait vous indiquer quelle DLL vous devez empaqueter avec votre application.

10

Vous devez définir la bibliothèque d'exécution (sous C/C++ -> Génération de code) pour tous les projets de liaison statique, qui est liée aux configurations de construction par défaut suivantes:

  • multithread Debug/Release
  • Singlethreaded Debug/Release

Contrairement aux versions "DLL" de ces bibliothèques.

Même si vous le faites, selon les bibliothèques que vous utilisez, vous devrez peut-être installer un module de fusion/framework/etc. Cela dépend si les versions LIB statiques de vos dépendances sont disponibles.

4

Soyez conscient que Microsoft do not recommend that you static link the runtime into your project, comme cela l'empêche d'être desservi par les fenêtres mise à jour pour corriger les bugs de sécurité critiques. Il y a aussi des problèmes potentiels si vous passez la mémoire entre vos fichiers .exe et .dll principaux comme si chacun de ces liens statiques l'exécution vous pouvez vous retrouver avec des problèmes de incompatibilité malloc/free.

Vous pouvez inclure les DLL avec l'exécutable, sans les compiler dans le fichier .exe et sans exécuter l'outil de redist - c'est ce que je fais et cela semble fonctionner correctement. La seule ombre de la pommade est que vous devez inclure les fichiers deux fois si vous distribuez pour une large gamme de versions de Windows - les nouveaux systèmes d'exploitation ont besoin des fichiers dans les répertoires définis par manifeste, et les plus anciens veulent tous les fichiers dans le répertoire du programme. Il suffit d'utiliser un assistant de configuration comme Inno Setup pour