Frage

Bei der Entwicklung und Bereitstellung von nativen Windows -Anwendungen muss ich häufig eine Laufzeit installieren, bevor ich meine Binärdatum ausführen oder die Bibliothek statisch mit meinem Binärer verknüpfen kann. Zum Beispiel, nach dem Erstellen eines "Win32 -Konsolen" -Projekts mit Visual Studio 2008, in dem versucht wurde, das Programm auf einem frischen Windows 7 -Bild zu führen, Ergebnisse in:

Die Anwendung hat nicht gestartet, da die Konfiguration von Seite an Seite falsch ist. Weitere Informationen finden Sie im Anwendungsereignisprotokoll oder verwenden Sie das Befehlszeilen-Tool SxStrace.exe.

Probleme wie diese wurden in angesprochen Andere Beiträge auf Stackoverflow.

Wie entwickelt man Anwendungen, die nicht Erfordernder Laufzeiten, die noch nicht im Zielbetrieb sind (dh keine neuverteilbaren Pakete oder private/freigegebene Side-by-Side-Baugruppen installieren)? Wie vermeidet man die Verwendung von MSVC [MPR] 90.dll und verwendet einfach die Windows -API in Windows System32*. {Dll, sys}?

Ich denke nach dem Code, der aus der Demoscen stammt, aber das wird häufig nicht zur Verfügung gestellt.

War es hilfreich?

Lösung

Andere haben bereits in Bezug auf die Verknüpfung von CRT statisch reagiert. Wenn Sie auch gleichzeitig eine kleine Binärdatei wünschen, ist die beste Wahl, die auf die CRT vollständig verzichtet, und verwenden Sie nur die Win32 -API -Funktionen so weit wie möglich. Sie erhalten immer noch einen CRT -Code, vor allem im Zusammenhang mit dem Start (dh das, was Anrufe main) und Abschalten (atexit Handhabung usw.), aber ansonsten verknüpft der Linker CRT -Funktionen, die Sie nicht verwenden, keine CRT -Funktionen.

Sie können es vermeiden, CRT durch Verwendung von CRT zu verknüpfen /Zl Compiler -Schalter. Das bedeutet, dass main funktioniert jedoch nicht mehr - Sie müssen definieren WinMain (Name spielt keine Rolle, aber die Unterschrift muss übereinstimmen, und es muss sein __stdcall), und Sie müssen den Namen Ihrer angeben WinMain-ähnliche Funktion als Einstiegspunkt über Linker /entry: Schalter. Dadurch sparen Sie ~ 30 KB CRT -Code (getestet auf einem .cpp mit einem leeren main).

Wenn Sie die letztere Route gehen, müssen Sie sich möglicherweise auch mit dem Thema Compiler Intrinsics befassen. Es gibt einige Funktionen, die vom CRT nominell definiert werden (und in seinen Headern deklariert), aber speziell vom Compiler behandelt werden, so dass es optimierte Montageanweisungen am Punkt des Anrufs nach Möglichkeit einfügt - Beispiele sind memset, strlen, und ein gutes Stück Funktionen in <math.h>; Eine vollständige Liste kann gefunden werden hier. Da Sie keine CRT haben, wenn Sie diese Funktionen benötigen oder sie vermeiden könnten, bevorzugen Sie das Intrinsische aufgrund einer verbesserten Leistung (schwer zu tun memset, Zum Beispiel), dann müssen Sie sie selbst deklarieren und verwenden #pragma intrinsic. Z.B:

// Contains macros and typedef only, so safe to include without CRT.
// We need it here for size_t.
#include <stddef.h> 

extern "C"
{
    int abs(int);
    void* memset(void*, int, size_t); 
}

#pragma intrinsic(abs, memset)

int __stdcall main(void*, void*, char*, int)
{
    char tmp[10];
    memset(tmp, abs(-123), 10);
    return 0;
}

Das obige kann zusammengestellt werden mit:

cl /c /Zl foo.cpp
link /entry:main foo.obj

Andere Tipps

Verknüpfen Sie die CRT statisch über die /MT Schalten (und ebenso MFC, wenn Sie es verwenden).

Die statische Verknüpfung begrenzt das, was Sie mit DLLs etwas tun können, aber für einfache ausführbare Funktionen funktioniert es wie ein Zauber. (Und wenn Sie DLLs versenden, können Sie trotzdem private Versammlungen versenden.)

Verwenden Sie die statische CRT. Dies schafft keine Abhängigkeit von MSVC*.dll. Die CRT ist direkt mit Ihrem Programm verbunden. Dies schafft keine Abhängigkeiten, erhöht jedoch die Größe Ihrer ausführbaren Datei.

Weitere Informationen zu verschiedenen CRT -Optionen hier.

Verknüpfen Sie die Laufzeit statisch. MS Visual C ++ hat eine Option /MT dafür (Standard ist /md)

Ich denke, eine Möglichkeit, dies zu tun, besteht darin, Visual Studio nicht zu verwenden und sich stattdessen auf die Befehlszeilen -SDK -Tools zu verlassen. (Sie können alternativ herausfinden, wie man vs konfiguriert, um das zu tun, was Sie wollen, aber das scheint schwieriger zu sein.) EG:

cl /c app.cpp
link app.obj ws2_32.lib
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top