2017-06-11 1 views
-1

Ich benutze Mingw und versuche Code der Standard-Bibliothek aus meiner Exe-Datei zu entfernen - g ++ -nostdlib -o main.exe main.cpp -luser32. Ja, es funktioniert, aber die erste Funktion wird immer zum Einstiegspunkt. Okay, alles, was ich brauche, ist das direkte Eingabesymbol - g ++ -nostdlib -e WinMain -o main.exe main.cpp -luser32. Jetzt bekomme ich "Warnung: Eingabe-Symbol WinMain nicht gefunden; standardmäßig auf 00401000". Danach wird die erste Funktion wieder zum Einstiegspunkt. Dann versuche ich nostdlib zu nodefaultlibs zu ändern und bekomme eine Menge Fehlermeldungen über "undefinierter Verweis auf 'irgendein Objekt'".Entfernen Sie die Standard-C++ - Bibliothek aus der EXE-Datei

Frage: So, wie kann ich Standardbibliothekscode entfernen und Programmeinstiegspunkt einstellen?

PS g ++ --version - g ++ (i686-posix-zwerg-rev0, Erstellt von MinGW-W64-Projekt) 5.3.0. main.cpp:

#include<windows.h> 

//this function called instead of WinMain 
int OtherFunction() 
{ 
    MessageBoxA(NULL,"OtherFunction","OtherFunction",MB_OK); 
    return 0; 
} 

int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) 
{ 
    MessageBoxA(NULL,"WinMain","WinMain",MB_OK); 
    return 0; 
} 
+0

Nur aus Neugier, warum versuchen Sie, die Standard-Bibliothek von ausführbaren zu entfernen? – Borgleader

+0

Ja, etwas ungewöhnlich, um die Std-Bibliothek zu entfernen. Nicht sicher, aber Sie müssen möglicherweise WinMain als extern "C" deklarieren, sonst wenn Sie als C++ kompilieren das Linker-Symbol für Ihre WinMain-Funktion wird dekoriert, ist also nicht "WinMain". Oder Sie sollten den (compilerspezifischen) dekorierten Namen in Ihrem Linker-Befehl verwenden. Wenn Sie nicht wissen, was das alles bedeutet, verwenden Sie eine bekannte Suchmaschine auf der Suche nach _C++ Name Dekoration_. Oder verweisen auf z.B. http://www.geeksforgeeks.org/extern-c-in-c/ aber TBH Ich bin mir nicht sicher, ob das sehr autoritativ ist. Aber es könnte genau sein, nicht sicher. HTH, barny. – barny

+0

barny: Ich versuche schon extern "C" und -e WinMain @ 16. Es funktioniert auch nicht. Borgleader: Für kleinere exe-Dateien. Wenn ich Nostdlib verwende, bekomme ich 3kb EXE-Datei. Wenn ich Nostdlib nicht verwende, bekomme ich 16 kb. Und wenn ich single push_back (1) benutze, bekomme ich 68kb. Ich bin nicht nervig. – Aso

Antwort

1

versuchen, etwas wie folgt aus:

extern "C" void WinMain() 
{ 
    // Code here 
    ExitProcess(0); 
} 

und Link mit -e _WinMain

+0

Warnung: Auflösung von _WinMain durch Verknüpfen mit _WinMain @ 16 ... Aber es funktioniert! Vielen Dank. – Aso

+1

@Aso Das '@ 16' ist wahrscheinlich, weil Sie die Standard-Aufrufkonvention auf Stdcall eingestellt haben? So oder so, wenn Sie nicht den CRT verwenden, hat Ihre WinMain-Funktion null Parameter, nicht vier. Diese vier Parameter werden von der CRT erzeugt. – Anders

Verwandte Themen