2009-10-17 4 views
9

Après avoir écrit une application CGI dans Visual Studio 2008 et l'avoir déboguée localement, je l'ai téléchargée sur un système d'exploitation Windows Server 2003 où elle a échoué rapidement.Exécution de fichiers binaires C++ sans l'exécutable redistribuable (Server2k3, XPSP3)

Je suppose que je dois installer le distribuables misérable d'exécution, mais après avoir lu ceci:

http://kobyk.wordpress.com/2007/07/20/dynamically-linking-with-msvcrtdll-using-visual-c-2005/

Je me demande s'il est plus logique d'ignorer ce côté par des trucs de côté et tout simplement ré-écriture l'application.

Je suppose que Windows Server 2003 n'a pas la version de MSCRVT dont j'ai besoin? Est-ce que Windows Server 2003 l'a?

En ce qui concerne le déploiement de clients lourds, je souhaite distribuer les DLL requises avec mon application. Que supposent-ils que je viens d'inclure iostream, sstream, string?

Est-ce que ça change de façon significative si j'ajoute windows.h?

Ajouté:

Utilisation du commutateur/MT recommandé ci-dessous

C/C++ -> Génération de code -> Runtime Library -> Multi-thread (/ MT)

(Vous aurez probablement besoin faire un nettoyage:

Construire -> nettoyer

afin d'éviter le message d'erreur

"Impossible d'enregistrer le manifeste mis à jour dans le fichier")

a gonflé mon application de 38k à 573k. C'est ce que j'appelle Significant (imaginez si c'était votre salaire). Comme de nombreuses instances de cette application seront chargées et déchargées en permanence (nécessitant de précieuses ressources de mémoire et de processeur), je voudrais trouver une meilleure solution (plus petite). Je comprends que ce n'est pas important pour de nombreuses situations aujourd'hui et pas l'objectif de nombreux développeurs, d'où la tendance à .NOT et 60MB runtimes, mais c'est ce que je veux faire.

Ajouté:

Après avoir enlevé le débogage pour obtenir le projet de compilation:

Projet -> Propeties -> c/C++ -> préprocesseur -> préprocesseur Définitions (supprimer DEBUG;)

la taille a été réduite à 300k, et elle fonctionnera.

Ajouté: Comme suggéré par Chris Becke ci-dessous, la copie: msvcm90.dll msvcp90.dll msvcr90.dll Microsoft.VC90.CRT.manifest le répertoire de l'application fournira toute la durée nécessaire. L'utilisation de Visual Studio 6 a été suggérée à quelques reprises, mais elle ne supporte pas Vista (ou Windows 7, nous supposons). D'autres solutions qui ne nécessitent pas une distribution distribuable me serviront probablement de MASM ou même un aperçu de Basic.Malheureusement, cela va à l'encontre de l'objectif d'utiliser un langage OOP de haut niveau tel que C++.

Tant que j'ai besoin d'exiger que le redistribuable C++ soit installé, le compromis est de 260k supplémentaires. Cest

+0

Est-ce que * quoi * change de manière significative? À peu près tout, presque tout ce que vous construisez avec VS2008 va nécessiter l'installation à l'exécution. – Joe

+0

Vous aurez besoin de l'exécution presque n'importe quoi. Votre choix est dans * comment * vous l'incluez. La méthode la plus pratique consiste à utiliser la version liée statiquement. Ensuite, vous n'avez pas à distribuer une DLL séparée du tout. A défaut, vous avez un demi-million de façons de distribuer la DLL. Allant de la chose côte à côte super-compliquée qui nécessite de lire 15 pages de documentation, de simplement le mettre dans un dossier avec le nom correct dans le dossier racine de votre application, ce qui est assez gérable. – jalf

+0

Je ne suis pas sûr de son efficacité, mais essayez de bidouiller avec les options du compilateur/éditeur de liens. Il y en avait quelques-uns qui affectaient la taille de l'exécutable (quelque chose à propos de l'optimisation de la taille et de la suppression des éléments inutilisés). –

Répondre

6

Une liste plus complète des options:

  • Réécrire l'application afin que Theres pas l'utilisation de C/C++ du tout.
  • Basculez vers Visual Studio 6 ou un jeu d'outils basé sur Mingw comme Code :: Blocks - ceux-ci utilisent le msvcrt.dll déjà distribué comme leur runtime.
  • Construire en utilisant le commutateur/MT. Cela construit les fonctions d'exécution nécessaires dans votre exe. Ce qui va le gonfler. Mais ce gonflement (franchement) est moins lourd que le chargement de dll séparés.
  • Distribuez l'environnement d'exécution VS9 en tant qu'installation 'sxs privée'. Cela implique de copier le contenu de C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT dans le même dossier que l'exe de votre application. Si vous avez appliqué SP1, ce dossier contiendra l'exécution SP1, mais votre application demandera l'exécution RTM (allez figure). Ajouter _BIND_TO_CURRENT_CRT_VERSION à vos projets définit, reconstruire et qui devrait se régler.
  • Il existe apparemment un fichier vc_redist.exe pouvant être obtenu pour VS9. Trouvez ou trouvez le mojo MSI ou installateur requis pour installer réellement l'assembly ci-dessus (étant le contenu de Microsoft.VC90.CRT) dans le magasin sxs partagé.
+0

Distribuez les travaux d'exécution VS9. Voir la discussion ci-dessus –

9

acceptable Permettez-moi de réviser ma réponse:

Vous avez quelques options:

1) Installez le moteur d'exécution VC++ 2008. Vous pouvez download et installateur pour eux. Des modules de fusion pour eux sont également disponibles.

2) Liaison statique avec l'exécution (/ MT ou C/C++ -> Génération de code -> Bibliothèque d'exécution: multithread). Cela augmentera la taille de votre exécutable, mais cela ne dépendra d'aucune DLL. Si vous vous inquiétez de la taille, utilisez uniquement la bibliothèque standard C ou utilisez uniquement l'API Windows directement.

3) Utilisez une ancienne version de VC++. 2005 et plus tôt n'a pas exigé l'exécution pour être installé. Les Dll pourraient être placés dans le même répertoire que l'exécutable. Si vous utilisez VC++ 6.0, les runtimes seront installés sur toutes les versions de Windows, sinon vous devrez l'installer vous-même.

+0

Je pense que vous voulez dire Propriétés du projet -> C/C++ -> Cod Génération -> Bibliothèque RUntime -> Multi-threaded (/ MT) –

+0

Codeur ou Cod? Haha .. tu as probablement raison, j'ai essayé de le faire de mémoire. –