[LINUX] Erstellen und Verwenden von statischen / dynamischen Bibliotheken in C-Sprache

Zweck

Sie können unter Linux zwei Arten von Bibliotheken erstellen: .a (statisch) und .so (dynamisch), die jedoch beim Kompilieren auf ähnliche Weise verwendet werden. Das heißt, selbst wenn libA.a und libA.so verschiedener Bibliotheken vorhanden sind, wird die Erweiterung der Bibliothek im Kompilierungsbefehl weggelassen und wird wie gcc xxx -lA, sodass nicht eindeutig ist, welche verwendet wird. ..

Ich möchte den Vorgang überprüfen, wenn libA.a und libA.so nebeneinander existieren. Notieren Sie sich dies.

Fazit zuerst

gcc -o main main.c -L. -lA Wenn die Bibliothek libA (angegeben durch -lA) angegeben wird, wird libA.so (dynamisch) bevorzugt mit libA.a (statisch) verknüpft.

*** Nachtrag *** gcc -o main main.c -L. -static -lA Wenn Sie "-static" wie angeben, wird libA.a (statisch) verknüpft.

*** Nachtrag 2 *** gcc -o main main.c -L. -static-libgcc -Wl,-Bdynamic,-lc,-Bstatic,-lA Sie können eine Bibliothek auswählen, indem Sie in der Option "-Wl" von gcc "-Bdynamic" (dynamisch) oder "-Bstatic" (statisch) angeben. (Vielen Dank @yumetodo!)

Beispielcode

Verwenden Sie den Code im folgenden Artikel. Sie können auch num in der statischen Bibliothek auf 5 und num in der dynamischen Bibliothek auf 10 setzen, um herauszufinden, welche zur Kompilierungszeit verwendet wurde.

Deklaration globaler Variablen der C-Sprache

Erstellung einer dynamischen Bibliothek und Funktionsprüfung

A.c


#include<stdio.h>
#include"A.h"

 void A(){
     num = 10;   //Setzen Sie num in der dynamischen Bibliothek auf 10
     printf("inside A, num = %d\n", num);
 }
#Erstellen Sie eine gemeinsam genutzte (dynamische) Bibliothek für A.
[pirlo@centos8 02]$ gcc -shared -o libA.so -c A.c
・ ・ ・
#Kompilieren Sie den Hauptprozess und erstellen Sie eine ausführbare Datei
[pirlo@centos8 02]$ gcc -o main main.c -L. -lA -lB
#Dateiliste
[pirlo@centos8 02]$ ls
A.c  A.h  B.c  B.h  libA.so  libB.so  main  main.c

Ausführungsergebnis


[pirlo@centos8 02]$ ./main 
inside A, num = 10
inside B, num = 10

Erstellen einer statischen Bibliothek und Überprüfen ihrer Funktion

A.c


#include<stdio.h>
#include"A.h"

 void A(){
     num = 5;   //Nur hier in der statischen Bibliothek ist anders
     printf("inside A, num = %d\n", num);
 }
#Erstellen Sie eine statische Bibliothek für A.
[pirlo@centos8 02]$ gcc -c A.c B.c   #Objekt".o "Datei wird erstellt
[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   #Erstellen Sie eine statische Bibliothek aus einer Objektdatei
[pirlo@centos8 02]$ ls
A.c  A.h  A.o  B.c  B.h  B.o  libA.a  main.c
・ ・ ・ Abkürzung für B-bezogene Verarbeitung ・ ・ ・
#Kompilieren Sie den Hauptprozess und erstellen Sie eine ausführbare Datei (Befehle sind genau die gleichen wie bei dynamischen)
[pirlo@centos8 02]$ gcc -o main main.c -L. -lA -lB
#Dateiliste
[pirlo@centos8 02]$ ls
A.c  A.h  A.o  B.c  B.h  B.o  libA.a  libB.a  main  main.c

Ausführungsergebnis


[pirlo@centos8 02]$ ./main 
inside A, num = 5
inside B, num = 5

Überprüfen Sie erneut, ob dynamische und statische Bibliotheken gleichzeitig vorhanden sind

#Dateiliste
[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
#Erstellen Sie die ausführbare Datei mit demselben Kompilierungsbefehl neu
[pirlo@centos8 02]$ gcc -o main main.c -L. -lA -lB

Ausführungsergebnis


[pirlo@centos8 02]$ ./main 
inside A, num = 10
inside B, num = 10

Zusammenfassung

Wenn dynamische und statische Bibliotheken nebeneinander existieren, wird bevorzugt auf die dynamische Bibliothek verwiesen.

*** Nachtrag *** Wenn Sie die Option "-static" hinzufügen, wird auf die statische Bibliothek verwiesen.

Ausführungsergebnis


[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
#「-Keine "statische" Option
[pirlo@centos8 02]$ gcc -o main main.c -L. -lA -lB
[pirlo@centos8 02]$ ./main 
inside A, num = 10
inside B, num = 10
#「-mit der Option "statisch"
[pirlo@centos8 02]$ gcc -o main main.c -L. -static -lA -lB
[pirlo@centos8 02]$ ./main 
inside A, num = 5
inside B, num = 5

*** Nachtrag 2 *** Sie können eine Bibliothek auswählen, indem Sie in der Option "-Wl" von gcc "-B dynamic" oder "-B static" angeben.

Ausführungsergebnis


#Verwenden Sie statische Bibliotheken A und 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
#Verwenden Sie alle dynamischen Bibliotheken
[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

Jede Referenz

Informationen zum Erstellen einer dynamischen Bibliothek finden Sie in den folgenden Inhalten

17.3. Erstellen einer dynamischen Bibliothek mit GCC

Informationen zum Erstellen einer statischen Bibliothek finden Sie im folgenden Inhalt

[17.4. Erstellen statischer Bibliotheken mit GCC und 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

Erstellen und Verwenden von statischen / dynamischen Bibliotheken in C-Sprache
Verwendung von Google Test in C-Sprache
Verwendung ist und == in Python
Verwendung der C-Bibliothek in Python
So generieren Sie eine Sequenz in Python und C ++
Wie man Decorator in Django benutzt und wie man es macht
So installieren und verwenden Sie Tesseract-OCR
Verwendung von Klassen in Theano
Verwendung von SQLite in Python
Wie Sie pyenv und pyenv-virtualenv auf Ihre eigene Weise verwenden
[Einführung in die Udemy Python3 + -Anwendung] 36. Verwendung von In und Not
Verwendung von .bash_profile und .bashrc
Vergleich der Verwendung von Funktionen höherer Ordnung in Python 2 und 3
So installieren und verwenden Sie Graphviz
Wie man MySQL mit Python benutzt
So verpacken Sie C in Python
Verwendung von ChemSpider in Python
Verwendung von PubChem mit Python
So erstellen Sie einen Datenrahmen und spielen mit Elementen mit Pandas
Verwendung von Funktionen in separaten Dateien Perl-Version und Python-Version
[C-Sprache] So erstellen, vermeiden und erstellen Sie einen Zombie-Prozess
Verwendung berechneter Spalten in CASTable
[Einführung in Python] Wie verwende ich eine Klasse in Python?
So installieren und verwenden Sie pandas_datareader [Python]
Verwendung von Anacondas Interpreter mit PyCharm
Python: Verwendung von Einheimischen () und Globalen ()
Verwendung von __slots__ in der Python-Klasse
Verwendung von Python zip und Aufzählung
Verwendung regulärer Ausdrücke in Python
So verwenden Sie Map in ViewPager von Android
Verwendung von pandas Timestamp und date_range
Einführung des Sinatra-Frameworks und dessen Verwendung
So erstellen Sie erklärende Variablen und Zielfunktionen
Verwendung der Python-Bildbibliothek in der Python3-Serie
So steuern Sie Multiprozesse ausschließlich in C-Sprache
Zusammenfassung der Verwendung von MNIST mit Python
So erstellen Sie Daten für CNN (Chainer)
Wie man tkinter mit Python in Pyenv benutzt
[Python] Verwendung von Hash-Funktion und Taple.
So erstellen Sie eine Rest-API in Django
So installieren Sie den Cascade-Detektor und wie verwenden Sie ihn
Wie man Autokorrelation und partielle Autokorrelation mit Python zeichnet
Tipps für diejenigen, die verwirrt sind, wie man is und == in Python verwendet
Verwendung von xml.etree.ElementTree
Wie benutzt man Python-Shell
Hinweise zur Verwendung von tf.data
Verwendung von virtualenv
Verwendung von Image-Match
Wie man Shogun benutzt
Verwendung von Pandas 2
Verwendung von Virtualenv
Verwendung von numpy.vectorize
Verwendung von pytest_report_header
Wie man teilweise verwendet
Wie man Bio.Phylo benutzt
Verwendung von SymPy
Wie man x-means benutzt