Come si ottiene un programma SDL minimo per compilare e collegare in Visual Studio 2008 Express?
-
29-08-2019 - |
Domanda
Sto cercando di utilizzare SDL in C ++ con Visual Studio 2008 Express. Il seguente programma viene compilato, ma non si link:
#include <SDL.h>
int main(int argc, char *argv[])
{
return 0;
}
L'errore link è:
LINK : fatal error LNK1561: entry point must be defined
ottengo questo indipendentemente da come o se collego con SDL.lib e SDLmain.lib. Definire main
come main()
o SDL_main()
dà lo stesso errore, con o senza extern "C"
.
Edit: Ho risolto questo non includendo SDL.h in main.cpp - un refactoring ho fatto indipendente dal problema. Una soluzione simile potrebbe essere quella di #undef main
destra prima di definire la funzione.
Soluzione
Non ho VC ++ disponibile al momento, ma ho visto questo problema più volte.
È necessario creare un progetto Win32 in contrapposizione ad un progetto di console. Un progetto Win32 si aspetta un WinMain funzione di un programma punto d'entrata. SDLmain.lib contiene questo punto di ingresso e il file di intestazione SDL_main.h ha una macro che remaps la funzione principale per SDL_main. Questa funzione viene chiamata dal punto di ingresso nella biblioteca SDLmain.
La funzione principale deve avere la seguente firma:
int main(int argc, char *argv[])
Si è inoltre tenuto a includere SDL.h prima della dichiarazione della funzione principale, e avete bisogno di collegare sia SDL.lib e SDLmain.lib.
Sembra che si sta facendo questo. Quindi, la mia ipotesi è che si ha un setup progetto di console. Pertanto, il linker è alla ricerca di una funzione principale di chiamare, ma è sempre rimappato al SDL_main dalla macro SDL_main.h . Così, il linker non riesce a trovare un punto di ingresso e dà in su!
Altri suggerimenti
A me ha aiutato a aggiungere le seguenti righe prima di main ():
#ifdef _WIN32
#undef main
#endif
Wikipedia tedesca suggerisce anche di aggiungere queste righe, invece:
#ifdef _WIN32
#pragma comment(lib, "SDL.lib")
#pragma comment(lib, "SDLmain.lib")
#endif
Anche se avevo ancora errori di collegamento quando ho provato seconda soluzione.
Il linker non riesce a trovare il punto di ingresso. Il che significa che la funzione main () non è riconosciuto come il punto di ingresso.
Se si dispone di un file .def, rimuoverlo.
Inoltre, se hai impostato il progetto per compilare con unicode e non come MBCS, è necessario utilizzare wmain () al posto di main ().