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

So stellen Sie ein Angular-Projekt mit Docker bereit

Es gibt zwei Möglichkeiten, Angular-Projekte mit ...

VMware Workstation-Installation (Linux-Kernel) Kylin-Grafik-Tutorial

In diesem Artikel erfahren Sie, wie Sie Kylin auf...

Bringen Sie Ihnen bei, wie Sie ein React+Antd-Projekt von Grund auf erstellen

Bei den vorherigen Artikeln handelte es sich um m...

MySQL in Ubuntu 18.04 installieren (grafisches Tutorial)

Tipp: Die folgenden Vorgänge werden alle mit Root...

Zusammenfassung gängiger Toolbeispiele in MySQL (empfohlen)

Vorwort Dieser Artikel stellt hauptsächlich die r...

Python schreibt die Ausgabe in den CSV-Vorgang

Wie unten dargestellt: def test_write(selbst): Fe...

Zwei Möglichkeiten zum vollständigen Löschen von Benutzern unter Linux

Linux-Betrieb Experimentelle Umgebung: Centos7-Vi...

Proxy realisiert das Prinzip der bidirektionalen Bindung von Vue3-Daten

Inhaltsverzeichnis 1. Vorteile von Proxy gegenübe...

So finden und löschen Sie doppelte Datensätze in MySQL

Hallo zusammen, ich bin Tony, ein Lehrer, der nur...

Einfache Implementierungsmethode der bidirektionalen Datenbindung im JS-Projekt

Inhaltsverzeichnis Vorwort Publish-Subscriber-Mus...

So verwenden Sie den Linux-Befehl md5sum

01. Befehlsübersicht md5sum - MD5-Prüfcode berech...

5 MySQL-GUI-Tools, die Ihnen bei der Datenbankverwaltung empfohlen werden

Es gibt viele Datenbankverwaltungstools für MySQL...

MySQL-Primärschlüssel-Benennungsstrategie im Zusammenhang

Als ich kürzlich die Details der Datenlebenszyklu...