SDL ohne Konsolenfenster?!



  • Hallo alle zusammen, bin neu hier und habe gleich mal eine Frage bzgl SDL.

    Ich habe es nun schon mit MSVC++, Dev-C++ und Code::Blocks ausprobiert, aber nirgendwo bekomme ich es hin, dass SDL kein Konsolenfenster erstellt.
    Ich meine, wozu auch...ich bin für MSVC++ nach diesem Tutorial vorgegangen:
    http://de.wikibooks.org/wiki/SDL:_Installation

    Man beachte diese Zeile:

    Unter "Project / Properties / Linker / System / SubSystem" Windows(/SUBSYSTEM:WINDOWS) auswählen. (Verhindert, dass die Konsole angezeigt wird)

    Sobald ich das tue erscheint folgende Meldung:

    sdlmain.lib(SDL_win32_main.obj) : error LNK2005: _main ist bereits in main.obj definiert.
    sdlmain.lib(SDL_win32_main.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_SDL_main" in Funktion "_main".
    

    Ich habe sdl.lib und sdlmain.lib drinne und alles läuft wunderbar, bis ich diese Einstellung vornehme 😕

    Hat einer von Euch eine Ahnung, wie das funktioniert?

    mfg

    P.S.:

    #ifdef WIN32
    #pragma comment(lib, "SDL.lib")
    #pragma comment(lib, "SDLmain.lib")
    #endif
    

    Dies habe ich auch schon ausprobiert, genau wie:

    #ifdef _WIN32
    #undef main
    #endif
    


  • Vielleicht hilft dir ja das weiter:
    http://www.libsdl.org/faq.php?action=listentries&category=4#48

    Btw.: erster Link bei google zu "SDL WinMain" und in den offiziellen FAQs

    Gruss,
    DeSoVoDaMu



  • Als ich vor ewigkeiten mal mit SDL gearbeitet habe, hing das (bei Dev-C++) vom Projekttyp ab. Wenn man eine "Konsolenanwendung" (wie auch immer das bei Dev-C++ heißt, habs nicht mehr da) hergenommen hat, hat er das Konsolenfenster angezeigt. Bei einer "Windowsanwendung" (o.ä.) nicht. IIRC dürfte das beeinflussen, wie deine "main"-Funktion vorbereitet wird (winmain/main).
    Hast du mal einen kompletten Re-Build probiert, evtl. sind dann deine Linker-Fehler ja weg 🙂



  • Versuch mal den WinAPI Aufruf FreeConsole().



  • Hallo, danke für die Antworten. FreeConsole funktioniert, leider Pop die Konsole noch auf. Ich habe es nun so gelöst, wie oben beschrieben, ich habe bloß vergessen

    int main()
    

    durch

    int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw)
    

    zu ersetzen...jetzt stellt sich mir die Frage warum soll man main benutzen? Könnte es zu Fehlern kommen?

    You should be using main() instead of WinMain() even though you are creating a Windows application, because SDL provides a version of WinMain() which performs some SDL initialization before calling your main code. If for some reason you need to use WinMain(), take a look at the SDL source code in src/main/win32/SDL_main.c to see what kind of initialization you need to do in your WinMain() function so that SDL works properly.

    Ich konnte in der besagten Datei keine schlüssigen Infos finden.

    Danke nochmal für die Hilfe

    Grüsse

    P.S.
    @DeSoVoDaMu:
    Ich habe nicht nach "SDL WinMain" gesucht, da ich WinMain völlig außer acht gelassen habe. Das liegt wohl daran, das Allegro es auch mit main schafft eine Konsolenlose Anwendung zu erstellen 😕



  • sofern du mingw als compiler nutzt (IMO der standard-compiler):
    haeng an deine compilerparameter "-mwindows" dran. dadurch wird statt einer consolen-applikation eine fensterapplikation erstellt.



  • Hi,
    ich habe es mal mit Visual C++ Toolkit 2003 getestet:

    #include <windows.h>
    #include <SDL.h>
    
    int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw)
    {
      SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE);
      return 0;
    }
    

    Funktioniert.
    Wichtig ist die Linkeroption, die besagt, dass WinMain als Einsprungspunkt genutzt wird (s. Post ueber mir fuer das mingw Equivalent):

    /SUBSYSTEM:WINDOWS
    

    SDLmain.lib brauchte ich nicht.

    Ich wundere mich eigentlich, dass es jetzt so ohne weiteres funktioniert 😃
    Ich hatte das zuvor auch schon einmal probiert (anderer Compiler/Linker) und da kamen immer nicht aufgeloeste Symbole zum Vorschein.

    Habe jetzt nur versucht ein leeren Fenster zu erstellen, in SDL_win32_main.c wird unter anderem DDraw.dll geladen, also schau da mal rein wenn noch Probleme auftreten.

    Gruss,
    DeSoVoDaMu


Anmelden zum Antworten