Some libraries are dynamically loaded and accessed through function pointers. In those cases, libraries do not have to be explicitly linked at compile time. Other libraries can be statically linked where they do not require dynamic loading but the linking is done at compile time. Then there are some libraries that are linked compile time but they just provide an easy to use interface for the dynamic loading process. A good example of this is the import address table in Win32 PE files. A call to NtTerminateProcess for example is found in ntdll library. You can call NtTerminateProcess dynamically by calling LoadLibrary and GetProcAddress or you can choose to link it compile time which will create the interface for you; However, ntdll will still need to be dynamically loaded at runtime. Linking it compile time was not static, it just merely allowed you to call NtTerminateProcess without the use of LoadLibrary/GetProcAddress.
So the question comes down to the difference between static linking, which what opengl is doing. Or dynamic linking which is what sdl is requiring. And as I mentioned earlier dynamic loading which at runtime allocates memory for the module to be loaded and loads it into an address specified by the OS. There's already a post that slightly covers this :
Difference between static linking and dynamic linking
difference between dynamic loading and dynamic linking?
With static linking, if your library ever changes you will need to recompile the binary. In the case of dynamic linking, you do not have to recompile the binary only the dlls.