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

Detailliertes Installationstutorial von Docker unter CentOS

Docker ist in CE und EE unterteilt. Die CE-Versio...

Verstehen Sie die Prinzipien und Anwendungen von JSONP in einem Artikel

Inhaltsverzeichnis Was ist JSONP JSONP-Prinzip JS...

Beispiel zur Optimierung der MySQL-Einfügeleistung

MySQL-Leistungsoptimierung Die MySQL-Leistungsopt...

Einführung in die Verwendung des Select-Optgroup-Tags in HTML

Gelegentlich muss ich ausgewählte Inhalte gruppier...

Tools zur Bildoptimierung für Webseiten und Tipps zur Verwendung

Als grundlegendes Element einer Webseite sind Bil...

Ubuntu 20.04 – Bestes Konfigurationshandbuch (unverzichtbar für Anfänger)

1. Systemkonfiguration 1. Deaktivieren Sie das Su...

So implementieren Sie Dual-Machine-Master und Backup mit Nginx+Keepalived

Vorwort Lassen Sie mich zunächst Keepalived vorst...

Lösen Sie das Installationsproblem von Linux Tensorflow2.0

conda aktualisieren conda pip installieren tf-nig...

Natives, benutzerdefiniertes Rechtsklickmenü von js

In diesem Artikelbeispiel wird der spezifische Co...

Verstehen Sie das elastische CSS3 FlexBox-Layout in 10 Minuten

Grundlegende Einführung Merkmale Flexbox ist ein ...

Detailliertes Tutorial zum PyCharm- und SSH-Remote-Access-Server-Docker

Hintergrund: Einige Experimente müssen auf dem Se...

Implementierungsprozess des Nginx-Hochverfügbarkeitsclusters

Dieser Artikel stellt hauptsächlich den Implement...

Der beste Weg, um den 1px-Rand auf Mobilgeräten zu lösen (empfohlen)

Bei der Entwicklung für Mobilgeräte tritt häufig ...