tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
4
ZUGRIFFE
1407
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    markzw markzw ist offline Mitglied
    Registriert seit
    Dec 2007
    Beiträge
    11
    Hallo zusammen,

    Ich möchte ein Programm welches die SDL library verwendet mit Visual Studio 2008 kompilieren und Linken um eine *.exe zu generieren.
    Problem: Der Compiler kompiliert ohne Fehler und Warnungen. Der Linker meldet jedoch folgende Fehlermeldung:

    LIBCMT.lib(crt0.obj) : error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup

    Betriebssystem: Win XP SP3
    Kompiler: Visual Studio 2008 (msvc)
    Linker: linker-msvc
    Debug: false
    Multithreaded: true
    runtime: static
    exeptions: false
    subsystem: console

    Zur veranschaulichung ein Codebeispiel, bei dem der Linkerfehler entsteht.
    Es muss nur SDL.h includiert werden, ansonsten kein Linkererror.
    Die SDL-library ist für windows. Unter linux (natürlich mit der entsprechenden sdl library für linux) funkttioniert das linken problemlos.

    /**********************************
    * begin c++ code
    */

    #include <SDL.h>

    int main(int argc, char* argv[])
    {
    return 0;
    }
    /*
    * end c++ code
    **********************************/

    Wenn ich anstelle von SDL.h SDL_events.h includiere, dann wird der Linkvorgang unter windows erfolgreich abgeschlossen.

    Ich habe via google schon verschiedene Lösungsansätze gefunden und geprüft, jedoch hat nichts geholfen.

    Könnt ihr mir Tipps geben oder weiterhelfen?
    Geändert von markzw (02.11.10 um 16:50 Uhr) Grund: solved
     

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Du mußt die SDLmain Bibliothek linken.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    markzw markzw ist offline Mitglied
    Registriert seit
    Dec 2007
    Beiträge
    11
    Danke für den Hinweis.
    Wenn nun mit SDLmain gelinkt wird meldet der Linker folgendes:

    Settings:
    outtype = executable
    multithreaded = true
    exceptions = false
    executable = true
    Libs: SDL_image, SDL_ttf, SDL_mixer, SDLmain, zlib

    -----------------
    [cc] msvcrt.lib(MSVCR90.dll) : error LNK2005: _exit already defined in LIBCMT.lib(crt0dat.obj)
    [cc] msvcrt.lib(MSVCR90.dll) : error LNK2005: _strrchr already defined in LIBCMT.lib(strrchr.obj)
    [cc] msvcrt.lib(MSVCR90.dll) : error LNK2005: _fprintf already defined in LIBCMT.lib(fprintf.obj)
    [cc] msvcrt.lib(MSVCR90.dll) : error LNK2005: _fopen already defined in LIBCMT.lib(fopen.obj)
    [cc] msvcrt.lib(MSVCR90.dll) : error LNK2005: _fclose already defined inLIBCMT.lib(fclose.obj)
    [cc] msvcrt.lib(MSVCR90.dll) : error LNK2005: __isctype already defined in LIBCMT.lib(isctype.obj)
    [cc] LIBCMT.lib(crt0init.obj) : warning LNK4098: defaultlib 'msvcrt.lib'conflicts with use of other libs; use /NODEFAULTLIB:library
    [cc] tst.exe : fatal error LNK1169: one or more multiply defined symbols found
    -----------------


    Wenn nun mit #pragma comment(linker, "/NODEFAULTLIB:msvcrt.lib") gelinkt wird:

    -----------------
    [cc] SDLmain.lib(SDL_win32_main.obj) : warning LNK4217: locally defined symbol _exit imported in function _main
    [cc] SDLmain.lib(SDL_win32_main.obj) : warning LNK4217: locally defined symbol _strrchr imported in function _main
    [cc] SDLmain.lib(SDL_win32_main.obj) : warning LNK4217: locally defined symbol _fprintf imported in function _ShowError
    [cc] SDLmain.lib(SDL_win32_main.obj) : warning LNK4217: locally defined symbol __iob imported in function _ShowError
    [cc] SDLmain.lib(SDL_win32_main.obj) : warning LNK4217: locally defined symbol _fopen imported in function _cleanup_output
    [cc] SDLmain.lib(SDL_win32_main.obj) : warning LNK4217: locally defined symbol _fclose imported in function _cleanup_output
    [cc] SDLmain.lib(SDL_win32_main.obj) : warning LNK4217: locally defined symbol __pctype imported in function _ParseCommandLine
    [cc] SDLmain.lib(SDL_win32_main.obj) : warning LNK4217: locally defined symbol ___mb_cur_max imported in function _ParseCommandLine
    [cc] SDLmain.lib(SDL_win32_main.obj) : warning LNK4217: locally defined symbol __isctype imported in function _ParseCommandLine
    [cc] SDLmain.lib(SDL_win32_main.obj) : error LNK2019: unresolved external symbol __imp__remove referenced in function _cleanup_output
    [cc] SDLmain.lib(SDL_win32_main.obj) : error LNK2019: unresolved external symbol __imp__fgetc referenced in function _cleanup_output
    [cc] SDLmain.lib(SDL_win32_main.obj) : error LNK2019: unresolved external symbol __imp__setbuf referenced in function _WinMain@16
    [cc] SDLmain.lib(SDL_win32_main.obj) : error LNK2019: unresolved external symbol __imp__setvbuf referenced in function _WinMain@16
    [cc] SDLmain.lib(SDL_win32_main.obj) : error LNK2019: unresolved external symbol __imp__freopen referenced in function _WinMain@16
    [cc] tst.exe : fatal error LNK1120: 5 unresolved externals
    ------------------


    Der Linker sucht in SDLmain.lib Funktionen die er nicht finden kann.


    Wenn:
    outtype = static
    (mit oder ohne msvcrt.lib linken)

    Dann entstehen keine Fehler und es wird eine *.lib Datei gelinkt.
    Benötige aber eine *.exe
     

  4. #4
    markzw markzw ist offline Mitglied
    Registriert seit
    Dec 2007
    Beiträge
    11
    Hab die Lösung gefunden:
    Wenn man Multithreaded DLL (/MD) verwenden - dann geht es.

    Mit /MD wird aber MSVCRT.lib benötigt. Ich möchte jedoch mit LIBC.lib - also Multithreaded (ohne DLL) builden, weil MSVCRT.lib nicht verfügbar ist.
    Geht das?
    Geändert von markzw (02.11.10 um 12:30 Uhr)
     

  5. #5
    markzw markzw ist offline Mitglied
    Registriert seit
    Dec 2007
    Beiträge
    11
    Problem gelöst:

    SDL.h nicht in Header sondern nur in cpp Dateien includieren, Library SDLmain.lib entfernen, compiler Multithreaded (/MT) wählen und dann funktionierts.

    Folgende sdl*.h files müssen in einer cpp Datei liegen:
    #include <SDL_image.h>
    #include <SDL_ttf.h>
    #include <SDL.h>

    Folgende *.h files dürfen auch in header verwendet werden:
    #include <SDL_video.h>
    #include <SDL_events.h>
     

Ähnliche Themen

  1. error LNK2019 & fatal error LNK1120
    Von HORNSWOGGLE im Forum C/C++
    Antworten: 4
    Letzter Beitrag: 24.11.09, 16:31
  2. Antworten: 2
    Letzter Beitrag: 31.07.08, 20:34
  3. Hilfe LNK2019 Error...
    Von spitzi92 im Forum VisualStudio & MFC
    Antworten: 2
    Letzter Beitrag: 21.05.08, 14:25
  4. [C++] 2 Linker-fehler (LNK2028,LNK2019)
    Von MSAB im Forum C/C++
    Antworten: 4
    Letzter Beitrag: 13.08.06, 15:52
  5. error LNK2019: unresolved external
    Von Nabi im Forum C/C++
    Antworten: 2
    Letzter Beitrag: 28.07.06, 11:21

Stichworte