c++ SDL: Linker error LNK2019

markzw

Grünschnabel
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?
 
Zuletzt bearbeitet:
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
 
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?
 
Zuletzt bearbeitet:
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>
 
Zurück