[Linux] Utilisation du compilateur GCC

Table des matières

Avant-propos :

 1. Processus de compilation GCC

1. Prétraitement :

2. compiler

3. compilation

4. lien

2. Créer et utiliser des bibliothèques dynamiques et statiques

1. Bibliothèque statique

2. Bibliothèque dynamique

 Trois options utiles

 1.gcc -E main.c

 2.gcc -E -dM main.c > 1.txt

  3.gcc -Wp,-MD,abc.dep -c -o main.o main.c

  4.echo 'main(){}'| gcc -E -v -


Avant-propos :

2-1. Processus de compilation GCC_哔哩哔哩_bilibili

2-2. Options communes GCC_哔哩哔哩_bilibili

(1) La chaîne d'outils de compilation gcc sur le PC peut compiler des programmes pouvant s'exécuter sur la plate-forme X 86. Pour compiler des programmes pouvant s'exécuter sur la plate-forme ARM, vous devez utiliser l'outil de compilation croisée xxx-gcc.

(2) Un fichier C/C++ doit passer par quatre étapes de prétraitement (génération du fichier .i) , de compilation (génération du fichier .s) , d'assemblage (génération du fichier .o) et de liaison (liaison au programme d'application) avant de pouvoir devenir un fichier exécutable. comme suit:

(3) Nous pouvons contrôler la sortie de différents fichiers via différentes options gcc. Les options couramment utilisées sont les suivantes :

 1. Processus de compilation GCC

1. Prétraitement :

Les commandes de prétraitement courantes dans les fichiers source C/C++ incluent les commandes d'inclusion (#inlcude), les commandes de définition de macro (#define) et les commandes de compilation conditionnelle (#if, #ifdef).

Le prétraitement consiste à insérer le fichier à inclure dans le fichier d'origine, à développer la définition de la macro, à sélectionner le code à utiliser en fonction de la commande de compilation conditionnelle et enfin à sortir ces éléments dans un fichier .i pour un traitement ultérieur.

2. compiler

La compilation consiste à "traduire" le code C/C++ (le fichier .i ci-dessus) en code assembleur.

3. compilation

 L'assemblage consiste à traduire la sortie du code assembleur lors de la deuxième étape en code machine conforme à un certain format, qui est généralement exprimé sous la forme d'un fichier objet ELF (fichier OBJ) sur un système Linux.

4. lien

La liaison consiste à lier le fichier OBJ généré à l'étape précédente avec le fichier OBJ et le fichier de bibliothèque de la bibliothèque système, et enfin à générer un fichier exécutable pouvant s'exécuter sur une plate-forme spécifique. 

2. Créer et utiliser des bibliothèques dynamiques et statiques

Portez une attention particulière au chemin de la bibliothèque utilisée.

1. Bibliothèque statique

Le fichier compilé à l'aide de la bibliothèque statique est relativement volumineux, ce qui intègre toutes les données de toute la bibliothèque de fonctions dans le code cible.Son avantage est que le programme d'exécution compilé n'a pas besoin de support de bibliothèque de fonctions externe.

gcc -c -o main.o main.c
gcc -c -o sub.o sub.c
//Créer une bibliothèque statique à partir du fichier .o
ar crs libsub.a sub.o 
//(Si .a n'est pas dans le répertoire courant, vous devez spécifier son chemin absolu ou relatif)
gcc -o test main.o libsub.a 

Remarque : Utilisez la commande ar pour générer une bibliothèque statique, vous devez utiliser le fichier .o pour la générer (les autres fichiers ne peuvent pas être utilisés). Et le fichier .a généré doit commencer par lib (ou la bibliothèque est introuvable).

2. Bibliothèque dynamique

La bibliothèque de fonctions dynamiques n'est pas compilée dans le code cible lors de la compilation et la fonction correspondante dans la bibliothèque de fonctions est appelée lorsque le programme exécute la fonction appropriée.

Par conséquent, par rapport à la bibliothèque statique, la bibliothèque dynamique économise de l'espace système.Lorsque vous rencontrez un bogue dans la bibliothèque, remplacez simplement la bibliothèque d'origine par une nouvelle.

gcc -c -o main.o main.c
gcc -c -o sub.o sub.c
gcc -shared -o libsub.so sub.o
gcc -o test2 main.o -L   /répertoire/  -lsub 
//(Prenons le répertoire courant comme exemple)
gcc -o test2 main.o -L ./ -lsub

 Remarque : Le fichier de bibliothèque dynamique généré se trouve dans le dossier en cours et son chemin doit être ajouté à lib ou au chemin spécifié lors de la compilation.

S'il n'y a pas de bibliothèque, vous devez également exécuter la commande suivante ( spécifiez le chemin ) lors de l'exécution :

exporter LD_LIBRARY_PATH=$LD_LIBRARY_PATH : ./
./test2

Exécutez des tests ( spécifiez le chemin ): 

 Trois options utiles

 1. gcc -E main.c

Affichez les résultats du prétraitement, par exemple quel fichier d'en-tête est  le résultat spécifique :

 2. gcc -E -dM main.c > 1.txt

 Développez toutes les macros et stockez-les dans 1.txt, un exemple spécifique (ouvrez 1.txt) : 

  3. gcc -Wp,-MD,abc.dep -c -o main.o main.c

Générez le fichier dépendant abc.dep, qui sera utilisé plus tard dans le Makefile, exemple spécifique (ouvrez abc.dep) :

  4. echo 'main(){}'| gcc -E -v -

Listez son répertoire de fichier d'en-tête et son répertoire de bibliothèque (LIBRARY_PATH) lors de la compilation de 'main(){}', exemple spécifique :

Je suppose que tu aimes

Origine blog.csdn.net/weixin_42373086/article/details/129887540
conseillé
Classement