Salut,
Sous Windows, le fait que l'on retrouve toujours les mêmes fonctions dans les même dll de l'OS (CreateWindow dans user32.dll, GetCommandLineA dans kernel32.dll...) garantit la compatibilité au niveau binaire. On peut compiler sous XP et exécuter le binaire sous Vista sans trop de problèmes en général.
Je me suis laissé dire que sous Linux, les binaires était moins portables que sous Windows. Je n'ai jamais trop saisi le système de librairies telles qu'elle sont utilisé sous Linux, où les .so (dll sous Linux) doivent être dans la bonne version (On m'a toujours dit qu'un exe qui veut toto.so en version 1.2 ne se satisfait pas de toto.so en version 1.3) Les infos données par la command
ld font assez peur.
Philosophiquement, les Linux et Unix sont plus orienté compatibilité au niveau source (Pour ce qui est du C tout du moins). Les sources en C compilent plutôt bien sur les unix, linux, mac et quelques OS propriétaires. Par contre, porter ces sources sous Windows peut poser problème du fait de l'inclusion de header absent sous Windows (signal.h, tout ce qui est communication inter process, thread...). De même, on ne peut pas (A part en regardant du côté de Wine) espérer compiler un source faisant une include de windows.h sous Linux.
En gros pour faire du source portable faut se limiter aux includes des fichiers de
cette page (Sans le c devant).
Ce qui limite beaucoup...

Ou alors profiter d'une librairie portable (GTK/GTK+, QT, wxWidgets...) Mais faut qu'elle soit installée sur le PC cible, ou la fournir.