2009-10-17 8 views
9

Nachdem ich eine CGI-Anwendung in Visual Studio 2008 geschrieben und lokal debigged hatte, habe ich sie auf ein Windows Server 2003-Betriebssystem hochgeladen, wo sie sofort fehlschlug.Ausführen von C++ - Binärdateien ohne die Laufzeit redistributable (Server2k3, XPSP3)

Ich schätze ich die elende Runtime ausschüttbaren installieren müssen, aber nach dem Lesen dieser:

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

Ich frage mich, ob es sinnvoller ist, diese Seite an Seite Sachen zu ignorieren und einfach neu zu schreiben die App.

Ich rate, Windows Server 2003 hat keine MSCRVT-Version, die ich brauche? Hat Windows Server 2003 es?

Wenn es sich um die Bereitstellung von Thick Clients handelt, möchte ich die erforderlichen DLLs mit meiner App verteilen. Was gehen sie davon aus, dass ich nur Iostream, Stream, String einschließe?

Ändert sich das erheblich, wenn ich windows.h hinzufüge?

Hinzugefügt:

den/MT-Schalter Mit empfohlen unter

C/C++ -> Code Generation -> Runtime Library -> Multi-Threaded (/ MT)

(Sie werden wahrscheinlich brauchen ein sauberes zu tun:

Körperbau -> sauber

, um die Fehlermeldung

zu vermeiden

"Fehler beim Speichern des aktualisierten Manifests in der Datei")

aufgebläht meine App von 38k bis 573k. Das nenne ich Significant (stellen Sie sich vor, wenn das Ihr Gehalt wäre). Da viele Instanzen dieser App ständig geladen und entladen werden (was wertvolle Speicher- und Prozessorressourcen erfordert), würde ich gerne eine bessere (kleinere) Lösung finden.

Ich verstehe, das ist nicht wichtig für viele Situationen heute und nicht der Fokus vieler Entwickler, daher der Trend zu .NOT und 60MB Laufzeiten, aber das ist, was ich tun möchte.

Hinzugefügt:

Nach dem Debuggen Entfernen das Projekt zu kompilieren:

Projekt -> propeties -> C/C++ -> Preprocessor -> Preprocessor Definitionen (entfernen DEBUG;)

Die Größe wurde auf 300k reduziert und es wird laufen.

Hinzugefügt: Wie von Chris Becke unten vorgeschlagen, Kopieren: msvcm90.dll msvcp90.dll msvcr90.dll Microsoft.VC90.CRT.manifest Um das Verzeichnis der Anwendung liefert alle Laufzeit benötigt. Die Verwendung von Visual Studio 6 wurde einige Male vorgeschlagen, unterstützt jedoch nicht Vista (oder Windows 7 nehmen wir an) Andere Lösungen, die keine verteilbare Laufzeit benötigen, wären wahrscheinlich MASM oder sogar eine Variante von Basic.Unglücklicherweise vereitelt dies den Zweck der Verwendung einer höheren OOP-Sprache wie C++.

Solange ich muss C++ Redistributable installiert werden müssen, ist der Kompromiss eine zusätzliche 260k. Das ist akzeptabel

+0

Ändert sich * was * signifikant? So ziemlich alles, was Sie mit VS2008 erstellen, wird auch die Runtime-Installation benötigen. – Joe

+0

Sie werden die Laufzeit fast egal was brauchen. Ihre Wahl ist * wie * Sie es einschließen. Die bequemste Methode ist die Verwendung der statisch verknüpften Version. Dann müssen Sie keine separate DLL verteilen. Andernfalls haben Sie eine halbe Million Möglichkeiten, die DLL zu verteilen. Angefangen von der superkomplizierten Side-by-Side-Sache, die das Lesen von 15 Seiten Dokumentation erfordert, um sie einfach in einen Ordner mit dem richtigen Namen im Stammordner Ihrer App zu stellen, der ziemlich überschaubar ist. – jalf

+0

Ich bin mir nicht sicher, wie effektiv das wäre, aber versuchen Sie, mit den Compiler/Linker-Optionen herumzuhantieren. Es gab einige, die sich auf die Größe der ausführbaren Datei auswirkten (etwas über das Optimieren der Größe und das Entfernen unbenutzter Sachen). –

Antwort

6

Eine ausführlichere Liste der Optionen:

  • die App neu schreiben, so dass Theres keine C/C++ Nutzung aller bei.
  • Wechseln Sie zu Visual Studio 6 oder einem Mingw-basierten Toolset wie Code :: Blocks - diese verwenden die bereits verteilte msvcrt.dll als ihre Laufzeit.
  • Build mit dem/MT-Schalter. Dies baut die notwendigen Laufzeitfunktionen in Ihrer exe auf. Das wird es aufblähen. Aber das Aufblähen (ehrlich gesagt) ist weniger Overhead als das Laden separater DLLs.
  • Verteilen Sie die VS9-Laufzeit als eine 'private sxs'-Installation. Dazu müssen Sie den Inhalt von C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT in den gleichen Ordner kopieren wie die Exe Ihrer Anwendung. Wenn Sie SP1 angewendet haben, enthält dieser Ordner die SP1-Laufzeit, aber Ihre Anwendung fragt nach der RTM-Laufzeit (go figure). Füge _BIND_TO_CURRENT_CRT_VERSION zu deinen Projekten hinzu, definiere, rebuild und das sollte sich aussortieren.
  • Es gibt anscheinend eine vc_redist.exe, die für VS9 erhalten werden kann. Finden Sie das oder ermitteln Sie das MSI- oder Installer-Mojo, das erforderlich ist, um die obige Assembly (die den Inhalt von Microsoft.VC90.CRT enthält) tatsächlich in den freigegebenen SXS-Speicher zu installieren.
+0

Verteilen Sie die VS9 Laufzeit funktioniert. Siehe Diskussion oben –

9

Lassen Sie mich meine Antwort revidieren:

Sie haben ein paar Optionen:

1) Installieren Sie die VC++ 2008 Runtime. Sie können download und Installer für sie. Zusammenführungsmodule für sie sind ebenfalls verfügbar.

2) Verbindung zur Laufzeit statisch (/ MT oder C/C++ -> Codegenerierung -> Laufzeitbibliothek: Multi-threaded). Dies wird die Größe Ihrer ausführbaren Datei erhöhen, aber es wird nicht von irgendwelchen DLLs abhängen. Wenn Sie sich Sorgen über die Größe machen, verwenden Sie nur die C-Standardbibliothek oder verwenden Sie nur die Windows-API direkt.

3) Verwenden Sie eine ältere Version von VC++. 2005 und früher musste die Laufzeit nicht installiert werden. Die Dlls können im selben Verzeichnis wie die ausführbare Datei abgelegt werden. Wenn Sie VC++ 6.0 verwenden, werden die Laufzeiten auf allen Windows-Versionen installiert, andernfalls müssen Sie sie selbst installieren.

+0

Ich denke du meinst Projekteigenschaften -> C/C++ -> Codegenerierung -> Runtime-Bibliothek -> Multi-threaded (/ MT) –

+0

Coder oder Cod? Haha .. du hast wahrscheinlich recht, ich habe versucht, es aus dem Gedächtnis zu machen. –

Verwandte Themen