Envoyé par
matlab_
je voulais dire: je trouve ça curieux, j'ai modifié mon précédent post.
merci
Si je comprends, c'est donc ld qui crée le fichier -o ? et g++ appelle ld ?
Envoyé par
white_tentacle
C’est bien cela.
L’avantage est que g++ t’ajoutes automatiquement toutes les librairies standard c++ quand il appelle ld, t’évitant de le faire toi-même.
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
g++ -c fichier.cpp -o fichier.pre -E
(comme il n'existe pas d'extension pour les fichiers préprocessés, l'extension pre semble pas si mal )
Si tu ouvres ce fichier, attention les yeux, un simple
1 2 3 4 5 6 7
| #include <iostream>
int main()
{
std::cout<<"hello world"<<std::endl;
return 0;
} |
se traduit en 15800 lignes de code à cause des inclusions indirectes
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
g++ -c fichier.cpp -o fichier.s -S
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
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
g++ -c fichier.cpp -o fichier.o
Enfin vient l'étape de l'édition de liens, qui correspond à la commande
g++ fichier1.o fichier2.o fichier3.o -o application.exe
G++ fait alors appel à l'éditeur de liens (ld) pour générer l'exécutable final.
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
g++ fichier1.cpp fichier2.cpp fichier3.cpp -o application.exe
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.
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 )
Partager