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.
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!)
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.
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
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
#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
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
[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