I tried to compile a simple C++ program that uses SDL 2 with the mingw-w64-g++ compiler on my Arch Linux (64bits).
For this I downloaded SDL2-devel-2.0.4-mingw.tar.gz from here
prog.cpp:
#include <SDL.h> int main () { SDL_Init (SDL_INIT_VIDEO); SDL_Window *sdlWnd = SDL_CreateWindow ("Test", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 800, 600, 0); SDL_Event event; bool running = true; while (running) { while (SDL_PollEvent (&event)) { if (event.type == SDL_QUIT) { running = false; break; } } } return 0; }
Makefile:
GPP = x86_64-w64-mingw32-g++ prog.exe: prog.o $(GPP) -o prog.exe prog.o -LSDL2-2.0.4/lib/x64 -lSDL2main -lSDL2 prog.o: prog.cpp $(GPP) -o prog.o -c -ISDL2-2.0.4/include prog.cpp
Now making gives the error:
x86_64-w64-mingw32-g++ -o prog.exe prog.o -LSDL2-2.0.4/lib/x64 -lSDL2main -lSDL2 Warning: corrupt .drectve at end of def file SDL2-2.0.4/lib/x64/SDL2main.lib(./x64/Release/SDL_windows_main.obj):(.text[main]+0x1c): undefined reference to `SDL_main'
Why undefined reference to `SDL_main’ ? Although I specified -lSDL2main ?
What did I do wrong? 🙁
Advertisement
Answer
Okay, it was because of the main functions signature, that has to be declared as:
int main(int argc, char *argv[])
according to the official SDL FAQ:
Make sure that you are declaring main() as:
#include "SDL.h" int main(int argc, char *argv[])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.