Pour les applications Windows, on utilise le format de ressources binaires de Win32 qui permet de faire ça.
Ces fichiers ont l'extension .res. Ils peuvent être générés directement par certains outils, ou compilés par le compilateur de ressources (rc.exe) à partir d'un fichier texte .rc.
Ensuite, tu fournis ce fichier (.res) au linker (ou compilateur) et il intègre les ressources dans l'exécutable. Le paramètre à fournir au linker (ou compilateur) va dépendre du compilateur. (Ça se trouve assez facilement pour VC++, mais pour GCC (MinGW) j'ai pas trouvé la doc)
Après, l'utilisation des ressources se fait via les API Win32. FindResource, LoadResource, LoadIcon, etc.
Mais en procédant ainsi, ton application n'est pas portable.
Le point de la portabilité n'est pas difficile à régler, il te suffit de créer des classes et/ou fonctions pour gérer les ressources de manière indépendante du système… Les méthodes seront implémentées différemment selon la plateforme cible, et le tour est joué.
Seulement, à ma connaissance, il n'existe pas de procédé totalement équivalent sur les plateformes autres que Windows. (C'est plutôt là que'est le problème. En gros, tu pourras le faire, mais seulement sous Windows).
Sous Mac OS X, les ressources ne sont pas inclues dans le binaire, mais sont packagées avec, et il existe des API prévus spécialement pour gérer l'accès aux ressources, qui restent des fichiers à part. (NB: C'est pas forcément très efficace au point de vue économie de l'espace disque)
Sous Linux, heu, je crois que tu dois te démerder toi même. (Ou utiliser un truc qui gère ça pour toi)
Mais le plus gros problème sans doute, c'est qu'en intégrant les ressources à l'exécutable, ça veut dire qu'elles vont toujours être mappées en mémoire, et probablement consommer de la RAM même lorsqu'elles ne sont pas utilisées.
Selon le nombre et la taille de tes ressources, il est peut-être préférable d'utiliser un format d'archive comme .zip, te permettant de réduire le nombre de fichiers visible (un exécutable et une archive de données), mais te laissant la possibilité de gérer tes ressources comme tu veux. En plus tu as le bénéfice potentiel de la compression, donc ton application peut se trouver moins volumineuse que par d'autres moyens...
(cross

)