# c++ SDL: Linker error LNK2019



## markzw (29. Oktober 2010)

*solved:  c++ SDL: Linker error LNK2019*

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?


----------



## deepthroat (29. Oktober 2010)

Hi.

Du mußt die SDLmain Bibliothek linken.

Gruß


----------



## markzw (2. November 2010)

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


----------



## markzw (2. November 2010)

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?


----------



## markzw (2. November 2010)

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>


----------

