Indeed. I was linking only SFML and FreeType.
So it seems that indirect dependencies, or dependencies of dependencies, must be linked too. I think I misunderstand something there. When I was building FreeType, I've configured it to use static libpng (also self-built). When I was building HarfBuzz, I've configured it to use static FreeType. And when I was building FreeType again, I've told it to use static HarfBuzz. And everywhere I've told everything to use static libraries, except for when building dynamic SFML (which did not link successfully anyway). Why must I still link the dependencies then? Why wasn't their code included into FreeType; isn't that the point of static libraries? Does the linker treat static libraries differently when linking a library vs an executable?
Adding HarfBuzz, HarfBuzz-free FreeType, libpng, Brotli, bzip2 and zlib did fix many errors, but there are still thirty-eight of them complaining about undefined references to HarfBuzz's objects in HarfBuzz's code and to Brotli's objects in Brotli's code. That is something even more strange.
But it's possible that these errors result from probably incorrectly built FreeType, so they are likely to fix when I rebuild FreeType correctly.
I still don't understand how linking a library with static dependencies works though.