WinMainCRTStartUp?



  • Habe CRT Funktionen komplett aus meinem Projekt gelassen, doch wenn ich jetzt dynamisch linke und mein Programm auf einem System ausführe wo nicht die C++ Redistributable installiert ist, gibt es immer noch die selbe Fehler Meldung.

    Ich habe dann die libcmt.lib mal ignoriert bei meinen Linker Optionen, dann ist mir aufgefallen das standardmäßg WinMainCRTStartUp gestartet wird, auch wenn ich in meinem Projekt WinMain stehen habe.

    Ziemlich komisch die ganze Sache, meine Frage: Kann ich es so einstellen das mein Projekt nicht mehr von der CRT abhängig ist?

    Die STL linke ich allerdings statisch, was ja auch kein Problem ist. Aber die CRT finde ich für mein Projekt ganz einfach nicht notwendig, deswegen möchte ich auf eine große Datei verzichten und auch nicht unbedigt das Redistributable Paket mitliefern.

    Alternativ würde ich auch eine kleinere CRT verwenden und dann alles statisch linken. Doch wie kann ich meinem Linker klar machen das er nicht die libcmt.lib linkt sondern meine eigene?

    Das war es erst einmal. Ich hoffe ich habe mich gut genug ausgedrückt. Zur Infoformation: Ich nutze Visual Studio 2008.

    lg Simon





  • Danke für den Link, also das man das Programm so klein erzeugen kann wusste ich nicht. Also muss ich nur einen eigenen Entry Point festlegen?

    Ich habe so etwas mal nachgestellt, mit STL Strings da ich diese Bibliothek ja gerne statisch linken möchte. Jedoch bekomme ich wieder die gleiche Fehlermeldung.
    "Die Anwendung konnte nicht gestartet werden, weil MSVCR90.dll nicht gefunden wurde. Neuinstallation der Anwendung könnte das Problem beheben."

    Alle Einstellungen die auf der Seite unten aufgeführt sind habe ich genau so übernommen, außerdem verwende ich nicht eine einzige CRT Funktion.

    #include <iostream>
    #include <string> //STL wird statisch gelinkt! (/D_STATIC_CPPLIB)
    #include <Windows.h>
    #pragma comment(linker, "/entry:entry")
    
    void entry()
    {
    	std::string sample = "Beispiel";
    	MessageBox(NULL, sample.c_str(), sample.c_str(), MB_OK);
    }
    

    Hier mein Projekt mit den Einstellungen: Download
    Ich hoffe jemand kann mir helfen. 🙂



  • Wenn Du die STL verwenden willst, brauchst Du zwangsläufig die CRT (oder was glaubst Du woher "new" kommt?)!

    Dein Problem ist ja nur, dass Du dynamisch linkst und statisch linken solltest!

    http://blog.kalmbach-software.de/de/2008/03/05/wie-man-statisch-gegen-die-c-runtime-crt-linkt/



  • Da hätte ich ja lange suchen können. Ich habe gedacht die Zwei sind komplett getrennt. Das ist richtig erbärmlich mit der CRT, sorry wenn ich das so sagen muss. 🙄 Wofür gibt es dann überhaupt D_STATIC_CPPLIB?

    Wenn ich komplett Statisch linke mit dem Beispiel dann bekomm ich das:
    1>LIBCMT.lib(crt0.obj) : error LNK2001: Nicht aufgelöstes externes Symbol "_main".



  • Ja, der Entry-Point einer normalen Anwendung heisst "main"... den hast Du wohl nicht...



  • In deinem Beispiel hast du doch auch "entry" verwendet als entry point? Oder ist das bei dir keine normale Anwendung? 😃



  • Linker|Advanced|Entry Point: entry



  • Wer hat gesagt das ich entry point nicht auf "entry" gesetzt habe? o.O Ich habe alle settings so übernommen ....



  • wmstarter schrieb:

    In deinem Beispiel hast du doch auch "entry" verwendet als entry point? Oder ist das bei dir keine normale Anwendung? 😃

    Hab ich ich meinem Beispiel die STL verwendet?



  • Ehm, also liegt es jetzt an der stl das ich alle bibliotheken nicht statisch linken kann?



  • wmstarter schrieb:

    Ehm, also liegt es jetzt an der stl das ich alle bibliotheken nicht statisch linken kann?

    WARUM kannst Du nicht statisch linken????
    Fehlermeldung!???

    Wenn Du die CRT verwendest5 heisst nun mal der Einstiegspunkt "main/wmain"; da kannst Du Dich drehen und wenden wie Du willst...



  • Sorry, habe mich in deinem Beispiel verguckt. 🙄
    Mir ist erst später aufgefallen das du lstrlen verwendet hast und nicht strlen, somit dachte ich das du auch die CRT verwendet hast, was ja dann doch nicht der Fall ist.

    Andere Frage, dann hör ich auf zu nerven:
    Theoretisch könnte ich ja dann eine andere bzw. kleine CRT verwenden wie zum Beispiel die hier: http://wcrt.sourceforge.net
    Wie kann ich meinem Linker klar machen das er nicht libcmt linken soll sondern die oben genannte?



  • I.d.R. steht sowas in der Doku des jeweiligen Produktes
    http://wcrt.sourceforge.net/doc/usage.html

    Das bezieht sich aber auf VC7.1 (VS2003). Für andere Version muss Du dort nachfragen... oder es eben selber probieren...


Anmelden zum Antworten