[LINUX] Comment créer et utiliser des bibliothèques statiques / dynamiques en langage C

Objectif

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.

Conclusion d'abord

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!)

Exemple de code

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.

Déclaration des variables globales du langage C

Création de bibliothèque dynamique et contrôle de fonctionnement

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

Créer une bibliothèque statique et vérifier son fonctionnement

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

Vérifiez à nouveau lorsque les bibliothèques dynamiques et statiques coexistent

#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

Résumé

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

Chaque référence

Reportez-vous au contenu suivant pour créer une bibliothèque dynamique

17.3. Créer une bibliothèque dynamique avec GCC

Reportez-vous au contenu suivant pour créer une bibliothèque statique

[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

Comment créer et utiliser des bibliothèques statiques / dynamiques en langage C
Comment utiliser Google Test en langage C
Comment utiliser is et == en Python
Comment utiliser la bibliothèque C en Python
Comment générer une séquence en Python et C ++
Comment utiliser Decorator dans Django et comment le créer
Comment installer et utiliser Tesseract-OCR
Comment utiliser les classes dans Theano
Comment utiliser SQLite en Python
Comment utiliser pyenv et pyenv-virtualenv à votre manière
[Introduction à l'application Udemy Python3 +] 36. Utilisation de In et Not
Comment utiliser .bash_profile et .bashrc
Comparaison de l'utilisation des fonctions d'ordre supérieur dans Python 2 et 3
Comment installer et utiliser Graphviz
Comment utiliser Mysql avec python
Comment envelopper C en Python
Comment utiliser ChemSpider en Python
Comment utiliser PubChem avec Python
Comment créer une trame de données et jouer avec des éléments avec des pandas
Comment utiliser les fonctions dans des fichiers séparés version Perl et version Python
[Langage C] Comment créer, éviter et créer un processus zombie
Comment utiliser les colonnes calculées dans CASTable
[Introduction à Python] Comment utiliser la classe en Python?
Comment installer et utiliser pandas_datareader [Python]
Comment utiliser l'interpréteur d'Anaconda avec PyCharm
python: Comment utiliser les locals () et globals ()
Comment utiliser __slots__ dans la classe Python
Comment utiliser le zip Python et énumérer
Comment utiliser les expressions régulières en Python
Comment utiliser Map dans ViewPager d'Android
Comment utiliser les pandas Timestamp et date_range
Introduction du cadre de style Sinatra et comment l'utiliser
Comment créer des variables explicatives et des fonctions objectives
Comment utiliser la bibliothèque d'images Python dans la série python3
Méthode de contrôle exclusive multi-processus en langage C
Résumé de l'utilisation de MNIST avec Python
Comment créer des données à mettre dans CNN (Chainer)
Comment utiliser tkinter avec python dans pyenv
[Python] Comment utiliser la fonction de hachage et taple.
Comment créer une API Rest dans Django
Comment installer le détecteur Cascade et comment l'utiliser
Comment tracer l'autocorrélation et l'autocorrélation partielle avec Python
Conseils pour ceux qui ne savent pas comment utiliser is et == en Python
Comment utiliser xml.etree.ElementTree
Comment utiliser Python-shell
Remarques sur l'utilisation de tf.data
Comment utiliser virtualenv
Comment utiliser la correspondance d'image
Comment utiliser le shogun
Comment utiliser Pandas 2
Comment utiliser Virtualenv
Comment utiliser numpy.vectorize
Comment utiliser pytest_report_header
Comment utiliser partiel
Comment utiliser Bio.Phylo
Comment utiliser SymPy
Comment utiliser x-means