It's not strange. It's Windows.
Your program needs a so-called entry point. It's a specific exported function that's called when the program is supposed to run. Once the function ends, the program ends as well.
Windows console programs follow the common pattern of calling this
main entry point simply
main(). So when you start a program, the operating system will look for an exported function
main() and then call it (simplified).
Windows GUI applications (i.e. those without a console Window by default) use a different entry point:
WinMain().
So if your Visual Studio project is set to be a console program, the linker will look for a function with the name
main(). If you're building a GUI program, you'll need a
WinMain(). The reason for the linker complaining about the missing reference is the added runtime, which will actually call the entry point defined by you.
What
sfml-main provides is essentially a small wrapper. This static library includes a
WinMain() that will try to call your actual
main() function, essentially making cross-platform code (providing
main() only) compile as a Windows application.