Der Dateiname der dynamischen Bibliotheksdatei unter Linux lautet beispielsweise libxxx.so, wobei so die Abkürzung für Shared Object ist, dh die Zieldatei, die gemeinsam genutzt werden kann. Beim Verknüpfen einer dynamischen Bibliothek zum Erzeugen einer ausführbaren Datei wird der Code der dynamischen Bibliothek nicht in die ausführbare Datei kopiert, sondern ein Verweis auf die dynamische Bibliothek wird in der ausführbaren Datei aufgezeichnet. Wenn das Programm ausgeführt wird, wird die dynamische Bibliotheksdatei geladen. Wenn die dynamische Bibliothek bereits geladen wurde, muss sie nicht erneut geladen werden, wodurch Speicherplatz gespart wird. Die Schritte zum Generieren und Verwenden dynamischer Bibliotheken unter Linux sind wie folgt:
Nachfolgend finden Sie eine ausführliche Erläuterung anhand von Beispielen. Schreiben von Quelldateien Erstellen Sie eine Quelldatei: max.c, der Code lautet wie folgt: int max (int n1, int n2, int n3) { Gibt an, ob die Variable n1 ist. max_Anzahl = max_Anzahl < n2? n2: max_Anzahl; max_Anzahl = max_Anzahl < n3? n3: max_Anzahl; gib max_num zurück; } Kompilieren und generieren Sie eine gemeinsam genutzte Bibliothek: gcc -fPIC -shared -o libmax.so max.c Wir werden libmax.so bekommen. Tatsächlich ist der obige Prozess in zwei Schritte unterteilt: Kompilieren und Verknüpfen. -fPIC ist die Kompilierungsoption. PIC ist die Abkürzung für Position Independent Code, was bedeutet, dass positionsunabhängiger Code generiert werden soll, eine Funktion, die dynamische Bibliotheken benötigen. -shared ist die Verknüpfungsoption, die gcc anweist, eine dynamische Bibliothek statt einer ausführbaren Datei zu generieren. Die obige Befehlszeile entspricht: gcc -c -fPIC max.c gcc -shared -o libmax.so max.o Schreiben von Schnittstellendateien für dynamische Bibliotheken Um den Benutzern mitzuteilen, welche Schnittstellen in unserer dynamischen Bibliothek verfügbar sind, müssen wir die entsprechenden Header-Dateien schreiben. Erstellen Sie max.h und geben Sie den folgenden Code ein: #ifndef __MAX_H__ #define __MAX_H__ int max (int n1, int n2, int n3); #endif Testen und verknüpfen Sie die dynamische Bibliothek, um eine ausführbare Datei zu generieren Erstellen Sie eine Datei test.c, die die Max-Funktion verwendet. Der Code lautet wie folgt: #include <stdio.h> #include "max.h" int main(int argc, char *argv[]) { Int a = 10, b = -2, c = 100; printf("max unter 10, -2 und 100 ist %d.\n", max(a, b, c)); gebe 0 zurück; } gcc test.c -L. -lmax generiert a.out, wobei -lmax bedeutet, libmax.so zu verknüpfen. -L. Gibt an, dass der aktuelle Pfad bei der Suche nach zu verknüpfenden Bibliotheksdateien einbezogen wird. Beachten Sie, dass, wenn dynamische und statische Bibliotheken mit demselben Namen im selben Verzeichnis vorhanden sind, z. B. libmax.so und libmax.a beide im aktuellen Pfad liegen. laufen Beim Ausführen von ./a.out wird die folgende Fehlermeldung ausgegeben.
libmax.so kann nicht gefunden werden. Es stellt sich heraus, dass Linux nach der zu verknüpfenden dynamischen Bibliothek über die Datei /etc/ld.so.cache sucht. Wenn wir den Pfad, in dem sich libmax.so befindet, zu /etc/ld.so.conf hinzufügen und dann das Programm ldconfig mit Root-Berechtigungen ausführen, um /etc/ld.so.cache zu aktualisieren, kann a.out libmax.so beim Ausführen finden. Aber als einfacher Testfall erscheint es uns unangebracht, Dinge im System zu ändern. Es gibt eine andere einfache Möglichkeit, nämlich LD_LIBRARY_PATH für a.out anzugeben. LD_LIBRARY_PATH=. ./a.out Das Programm wird normal ausgeführt. LD_LIBRARY_PATH=. weist a.out an, zuerst im aktuellen Pfad nach der verknüpften dynamischen Bibliothek zu suchen. Bei ausführbaren Programmen im Elf-Format erfolgt dies durch ld-linux.so*, das das DT_RPATH-Segment der Elf-Datei, die Umgebungsvariable LD_LIBRARY_PATH, die Dateiliste /etc/ld.so.cache und die Verzeichnisse /lib/,/usr/lib durchsucht und die Bibliotheksdatei nach dem Auffinden in den Speicher lädt. Makefile automatisiert die Arbeit Schreiben Sie ein Makefile mit folgendem Inhalt: .PHONY: sauberer Build-Test Erstellen: libmax.so libmax.so: max.o gcc -o $@ -shared $< max.o: max.c gcc -c -fPIC $< Test: a.out a.out: test.c libmax.so gcc test.c -L. -lmax LD_LIBRARY_PATH=. ./a.out sauber: rm -f *.o *.so a.out „make build“ generiert libmax.so, „make test“ generiert „a.out“ und führt es aus und „make clean“ bereinigt die Kompilierungs- und Testergebnisse. Dies ist das Ende dieses Artikels mit einer detaillierten Erklärung zur Generierung dynamischer Bibliotheken unter Linux und einer Gebrauchsanweisung. Weitere relevante Inhalte zur Generierung dynamischer Bibliotheken unter Linux finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
<<: Eine kurze Diskussion über die MySQL-Zeilenanzahl
>>: React realisiert sekundären Verknüpfungseffekt (Treppeneffekt)
Docker ist in CE und EE unterteilt. Die CE-Versio...
Inhaltsverzeichnis Was ist JSONP JSONP-Prinzip JS...
Im eigentlichen Projektentwicklungsprozess wird di...
Dieser Artikel beschreibt anhand eines Beispiels ...
MySQL-Leistungsoptimierung Die MySQL-Leistungsopt...
Gelegentlich muss ich ausgewählte Inhalte gruppier...
Als grundlegendes Element einer Webseite sind Bil...
1. Systemkonfiguration 1. Deaktivieren Sie das Su...
Vorwort Lassen Sie mich zunächst Keepalived vorst...
conda aktualisieren conda pip installieren tf-nig...
In diesem Artikelbeispiel wird der spezifische Co...
Grundlegende Einführung Merkmale Flexbox ist ein ...
Hintergrund: Einige Experimente müssen auf dem Se...
Dieser Artikel stellt hauptsächlich den Implement...
Bei der Entwicklung für Mobilgeräte tritt häufig ...