Apologies for the dire subject line but that is still how I feel about it, and I haven't found many satisfactory answers in available search links. The issue is the so-called "major change" in GCC behavior as they went to gcc-4.7;
here is the announcement in gcc-4.7.2-1-mingw32.README
Binary incompatibility notice!
The C and C++ ABI changed in GCC 4.7.0, which means in general you can't link together binaries compiled with this version of the compiler and with versions before GCC 4.7.0. In particular:
* The option -mms-bitfields is enabled by default, which means the bitfield layout
follows the convention of the Microsoft compiler.
* C++ class-member functions now follow the __thiscall calling convention.
* The compiler now assumes that the caller pops the stack for the implicit arguments pointing to an aggregate return value. This affects functions returning structs by value, like the complex math type.
Evidently, to build a package using gcc4.7 or better you need all (XXX.dll, XXX.a, XXX.o), and any included for dependencies, to be compiled with version > 4.7 or you might get random troubles.
Even if this were easy, it is quite disruptive. However the GCC version information is not embedded in most binaries
so how can it even be implemented properly?