>
But also, compiling everything with dynamic libraries is kind of an interesting side effect of having all the source code in a single context of a distribution
Under Windows, this is also done. But there is a difference: changes in a system-wide DLL better are really backwards-compatible.
If there are breaking changes, a new "package" gets introduced with new names for the DLLs. This is why on many Windows systems, lots of versions of, for example, the "Microsoft Visual C++ Redistributable" are installed. Nevertheless, the old versions are still available and get maintained for a very long time at least with respect to security fixes.
Also, the API design under Windows tends to be much more "future-proof". For example, a lot of data structures contain some size information as a first field so that the API can detect which "version" of a data structure has been passed so that future changes can be implemented in a backwards-compatible manner, e.g. WNDCLASSEXA:
Under Windows, this is also done. But there is a difference: changes in a system-wide DLL better are really backwards-compatible.
If there are breaking changes, a new "package" gets introduced with new names for the DLLs. This is why on many Windows systems, lots of versions of, for example, the "Microsoft Visual C++ Redistributable" are installed. Nevertheless, the old versions are still available and get maintained for a very long time at least with respect to security fixes.
Also, the API design under Windows tends to be much more "future-proof". For example, a lot of data structures contain some size information as a first field so that the API can detect which "version" of a data structure has been passed so that future changes can be implemented in a backwards-compatible manner, e.g. WNDCLASSEXA:
> https://learn.microsoft.com/en-us/windows/win32/api/winuser/...
The first field is cbSize.
To me, it seems in the GNU/Linux ecosystem, the API developers care a lot less about such topics.