White, tu as sans doute mal lu.. l'option -o se contente d'indiquer le non du fichier de sortie ;)
En fait, il faut comprendre la chaine de compilation :
La première chose qui est faite par g++ est d'appeler le préprocesseur (cpp dans cette chaine de travail) qui va passer chaque fichier en revue à la recherche des différentes directives préprocesseur.
Tu peux avoir un aperçu du résultat avec la commande
(comme il n'existe pas d'extension pour les fichiers préprocessés, l'extension pre semble pas si mal :D)Code:g++ -c fichier.cpp -o fichier.pre -E
Si tu ouvres ce fichier, attention les yeux, un simple
se traduit en 15800 lignes de code à cause des inclusions indirectes ;) :PCode:
1
2
3
4
5
6
7 #include <iostream> int main() { std::cout<<"hello world"<<std::endl; return 0; }
La deuxième étape est celle de la génération de code assembleur.
tu peux te faire une idée du résultat avec la commande
Je ne sais plus exactement quel est le backend utilisé dans le cas d'un code C++, mais il n'est pas exclu que ce soit le travail de g++ lui-meme ;)Code:g++ -c fichier.cpp -o fichier.s -S
Vient ensuite l'appel à as pour générer le code "objet" au départ du code assembleur
Le résultat obtenu n'est plus "lisible par un humain" car le code est composé des instructions que le processeur va lui-même utiliser ;)
C'est ce que tu obtiens avec la commande
Enfin vient l'étape de l'édition de liens, qui correspond à la commandeCode:g++ -c fichier.cpp -o fichier.o
G++ fait alors appel à l'éditeur de liens (ld) pour générer l'exécutable final.Code:g++ fichier1.o fichier2.o fichier3.o -o application.exe
Son rôle sera de remplacer les différents symboles correspondant aux appels de fonctions par les adresses auxquelles ces fonctions se trouvent réellement en mémoire ;)
On peut aussi parfaitement envisager de générer directement l'exécutable (donc en utilisant des pipes au lieu de fichier *.o) avec une commande proche de
Evidemment, cette manière de travailler devient assez vite fastidieuse dans le contexte d'un projet important, peut etre subdivisé en un nombre important de sous bibliothèques, composé d'une arborescence complexe ou susceptible d'avoir un certain nombre de définitions de symboles pour modifier le comportement à la compilation.Code:g++ fichier1.cpp fichier2.cpp fichier3.cpp -o application.exe
C'est la raison pour laquelle on préfère généralement utiliser un système qui permet d'automatiser la chaine de compilation ;)
NOTA:
Cela correspond aux étapes "logiques" de compilation, cependant, le fait d'appeler la commande g++ -c fichier.cpp -o fichier.o va en fait utiliser des pipes pour passer les différentes étapes (et je ne suis même pas sur qu'il devra effectivement passer par une étape en code assembleur :P)