Detaillierte Erläuterung der Generierung dynamischer Bibliotheken unter Linux und Anleitung zur Verwendung

Detaillierte Erläuterung der Generierung dynamischer Bibliotheken unter Linux und Anleitung zur Verwendung

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:

  • Schreiben Sie die Quelldatei.
  • Kompilieren und verknüpfen Sie eine oder mehrere Quelldateien, um eine gemeinsam genutzte Bibliothek zu generieren.
  • Verknüpfen Sie die generierte libxxx.so über die gcc-Option -L<Pfad> -lxxx
  • Legen Sie libxxx.so in den Standardpfad der Linkbibliothek ein oder geben Sie LD_LIBRARY_PATH an, um das mit libxxx.so verknüpfte Programm auszuführen.

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.
Dann priorisiert gcc die Verknüpfung dynamischer Bibliotheken.

laufen

Beim Ausführen von ./a.out wird die folgende Fehlermeldung ausgegeben.

./a.out: Fehler beim Laden gemeinsam genutzter Bibliotheken: libmax.so: Gemeinsam genutzte Objektdatei kann nicht geöffnet werden: Keine solche Datei oder kein solches Verzeichnis

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.
/etc/ld.so.cache wird vom Programm ldconfig generiert, das die Datei /etc/ld.so.conf liest.
(Beachten Sie, dass /etc/ld.so.conf /lib und /usr/lib nicht enthalten muss, das Programm ldconfig durchsucht diese beiden Verzeichnisse automatisch.)

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:
  • Linux generiert (lädt) dynamische Bibliotheken, statische Bibliotheken und lädt Beispielmethoden

<<:  Eine kurze Diskussion über die MySQL-Zeilenanzahl

>>:  React realisiert sekundären Verknüpfungseffekt (Treppeneffekt)

Artikel empfehlen

Drei Möglichkeiten zur Kommunikation zwischen Docker-Containern

Wir alle wissen, dass Docker-Container voneinande...

JDBC-Idee: MySQL importieren, um Java-JAR-Paket zu verbinden (Mac)

Vorwort 1. Dieser Artikel verwendet MySQL 8.0 Ver...

Designideen für MySQL-Backup und -Wiederherstellung

Hintergrund Lassen Sie mich zunächst den Hintergr...

Natives JS zur Implementierung eines atmenden Karussells

Heute zeige ich Ihnen ein mit nativem JS implemen...

Implementierung der Nummernschild-Eingabefunktion im WeChat-Applet

Inhaltsverzeichnis Vorwort Hintergrund Große Verm...

MySQL ruft die aktuelle Datums- und Uhrzeitfunktion ab

Holen Sie sich das aktuelle Datum + die aktuelle ...

Einführung in die Parameter und Regeln für reguläre Ausdrücke bei Nginx

Vorwort In letzter Zeit habe ich Kunden dabei geh...

Spezifische Verwendung von Docker Anonymous Mount und Named Mount

Inhaltsverzeichnis Datenvolumen Anonyme und benan...

Der gesamte Prozess der Konfiguration von Hive-Metadaten für MySQL

Gehen Sie im Hive-Installationsverzeichnis in das...

Vue implementiert eine einfache bidirektionale Datenbindung

In diesem Artikelbeispiel wird der spezifische Co...

Warum TypeScripts Enum problematisch ist

Inhaltsverzeichnis Was ist passiert? Verwendung S...

Liste der HTML-Tags und Hinweise zur Verwendung

Liste der HTML-Tags markieren Typ Name oder Bedeu...

Vue elementUI implementiert Baumstrukturtabelle und Lazy Loading

Inhaltsverzeichnis 1. Ergebnisse erzielen 2. Back...