-lSDL sert à linker avec la lib SDL.
du coté de gcc :
quand tu ajoutes une option -l<blabla>, gcc cherche le fichier libblabla.a d'abord dans les chemin passés en paramètre avec l'option -L/chemin/vers/mes/lib puis dans les chemins des lib par défaut données à la compilation de gcc. (habituellement /usr/lib)
du coté deSDL :
Tu te doute bien que quand tu fais appel aux fonction SDL comme SDL_PollEvent ou autre, il y a bien du code C (ou autre) qui est exécuté quelque part, don clogiquement tu te dis qu'il y a une lib avec laquelle tu dois linker !
Maintenant, tu vas me dire que quand tu fais des printf, tu ne link avec rien... Et bien c'est faut, gcc link TOUJOURS tes programmes avec la libc (/lib/libc.so.6 sous linux) par defaut (il y a une option pour le virer si tu ne le veux pas) et si tu fais du C++, g++ link aussi avec libstdc++.so.6 (6 depuis gcc 3.4, avant c'était 5, mais il y a eu de gros changements depuis, c'est pour ça que tu ne peux pas mélanger du code c++ compilé avec gcc 3.3 et gcc 3.4 et +)
Maintenant, comment savoir qu'il fallait utiliser -lSDL et pas un autre ?
1) c'est bien présent dans la doc sur le site officiel, il faut juste chercher un peu.
2) SDL fourni un utilitaire qui s'appelle sdl-config (décrit aussi dans la doc) qui te permet de la savoir
3) Quand j'installe une nouvelle lib de dévelopement, j'ai toujours le réflexe (sur debian) de faire un "dpkg -L libmalib-dev | grep lib" (dans le cas de SDL donc dpkg -L libsdl1.2-dev | grep lib) ce qui me donne les fichiers installés par le package libsdl1.2-dev dans le dossier lib, généralement, il n'y en a que 2 (le fichier .a pour linker et le .so pour exécuter) et donc je vois totu de suite avec quoi il faut que je link mon truc