Vous pouvez créer deux types de bibliothèques sous Linux, .a (statique) et .so (dynamique), mais elles sont utilisées de la même manière lors de la compilation. Autrement dit, même si libA.a et libA.so de bibliothèques différentes existent, l'extension de la bibliothèque est omise dans la commande de compilation et elle devient comme gcc xxx -lA, donc il est ambigu de savoir laquelle est utilisée. ..
Je veux vérifier le fonctionnement lorsque libA.a et libA.so coexistent, alors prenez note.
gcc -o main main.c -L. -lA Lorsque la bibliothèque libA (spécifiée par -lA) est spécifiée, libA.so (dynamique) est liée de préférence à libA.a (statique).
*** Addenda *** gcc -o main main.c -L. -static -lA Si vous spécifiez "-static" comme, libA.a (statique) sera lié.
*** Addendum 2 *** gcc -o main main.c -L. -static-libgcc -Wl,-Bdynamic,-lc,-Bstatic,-lA Il est possible de sélectionner une bibliothèque en spécifiant "-Bdynamic" (dynamique) ou "-Bstatic" (statique) dans l'option "-Wl" de gcc. (Merci beaucoup @yumetodo!)
Utilisez le code dans l'article ci-dessous. Vous pouvez également définir num sur 5 dans la bibliothèque statique et num sur 10 dans la bibliothèque dynamique pour savoir lequel a été utilisé au moment de la compilation.
A.c
#include<stdio.h>
#include"A.h"
void A(){
num = 10; //Définissez num sur 10 dans la bibliothèque dynamique
printf("inside A, num = %d\n", num);
}
#Créer une bibliothèque partagée (dynamique) pour A
[pirlo@centos8 02]$ gcc -shared -o libA.so -c A.c
・ ・ ・
#Compilez le processus principal et créez un fichier exécutable
[pirlo@centos8 02]$ gcc -o main main.c -L. -lA -lB
#Liste des fichiers
[pirlo@centos8 02]$ ls
A.c A.h B.c B.h libA.so libB.so main main.c
Résultat d'exécution
[pirlo@centos8 02]$ ./main
inside A, num = 10
inside B, num = 10
A.c
#include<stdio.h>
#include"A.h"
void A(){
num = 5; //Seulement ici dans la bibliothèque statique est différent
printf("inside A, num = %d\n", num);
}
#Créer une bibliothèque statique pour A
[pirlo@centos8 02]$ gcc -c A.c B.c #objet".o "le fichier est créé
[pirlo@centos8 02]$ ls
A.c A.h A.o B.c B.h B.o main.c
[pirlo@centos8 02]$ ar rcs libA.a A.o #Créer une bibliothèque statique à partir d'un fichier objet
[pirlo@centos8 02]$ ls
A.c A.h A.o B.c B.h B.o libA.a main.c
・ ・ ・ Abréviation du traitement lié à B ・ ・ ・
#Compilez le processus principal et créez un fichier exécutable (les commandes sont exactement les mêmes que lorsqu'elles sont dynamiques)
[pirlo@centos8 02]$ gcc -o main main.c -L. -lA -lB
#Liste des fichiers
[pirlo@centos8 02]$ ls
A.c A.h A.o B.c B.h B.o libA.a libB.a main main.c
Résultat d'exécution
[pirlo@centos8 02]$ ./main
inside A, num = 5
inside B, num = 5
#Liste des fichiers
[pirlo@centos8 02]$ ls
A.c A.h A.o B.c B.h B.o libA.a libA.so libB.a libB.so main.c
#Recréez le fichier exécutable avec la même commande de compilation
[pirlo@centos8 02]$ gcc -o main main.c -L. -lA -lB
Résultat d'exécution
[pirlo@centos8 02]$ ./main
inside A, num = 10
inside B, num = 10
Lorsque les bibliothèques dynamiques et statiques coexistent, la bibliothèque dynamique est référencée de préférence.
*** Addenda *** Si vous ajoutez l'option "-static", la bibliothèque statique sera référencée.
Résultat d'exécution
[pirlo@centos8 02]$ ls
A.c A.h A.o B.c B.h B.o libA.a libA.so libB.a libB.so main.c
#「-Aucune option «statique»
[pirlo@centos8 02]$ gcc -o main main.c -L. -lA -lB
[pirlo@centos8 02]$ ./main
inside A, num = 10
inside B, num = 10
#「-avec option "statique"
[pirlo@centos8 02]$ gcc -o main main.c -L. -static -lA -lB
[pirlo@centos8 02]$ ./main
inside A, num = 5
inside B, num = 5
*** Addendum 2 *** Vous pouvez sélectionner une bibliothèque en spécifiant "-B dynamic" ou "-B static" dans l'option "-Wl" de gcc.
Résultat d'exécution
#Utiliser les bibliothèques statiques A et B
[pirlo@centos8 02]$ gcc -o main main.c -L. -static-libgcc -Wl,-Bdynamic,-lc,-Bstatic,-lA,-lB
[pirlo@centos8 02]$ ./main
inside A, num = 5
inside B, num = 5
#Utiliser toutes les bibliothèques dynamiques
[pirlo@centos8 02]$ gcc -o main main.c -L. -static-libgcc -Wl,-Bdynamic,-lc,-lA -lB
[pirlo@centos8 02]$ ./main
inside A, num = 10
inside B, num = 10
[17.4. Création de bibliothèques statiques avec GCC et ar](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/developer_guide/creating-libraries-gcc_creating-static-libraries -gcc)
Recommended Posts