Artikelverzeichnis
Vorwort
Die Dynamic Link Library ist ein wichtiges Werkzeug für die Wiederverwendung und Modularisierung von Code. Sie erleichtert die Kapselung von Funktionen in unabhängige Bibliotheken. Gleichzeitig können diese Bibliotheken dynamisch geladen und aktualisiert werden, was die Flexibilität und Wartbarkeit des Programms verbessert.
Wenn wir C++-Quellcode in eine Dynamic Link Library kompilieren und diese Dynamic Link Library in anderen Anwendungen aufrufen möchten, ist dies das Anwendungsszenario dieses Artikels. In diesem Dokument wird erläutert, wie Sie die C++ Dynamic Link Library erstellen, kompilieren, verknüpfen und aufrufen.
PS: Der folgende Inhalt dieses Artikels basiert auf meinem tatsächlichen Arbeitsprojekt und ist nicht in Form einer Demo.
Generieren Sie eine dynamische Linkbibliothek für C++
Schritt 1: Schreiben Sie C++-Quellcode
Schreiben Sie zunächst C++
die Quellcodedatei, einschließlich der erforderlichen Klassen und Funktionen. (Jeder, der diesen Artikel liest, sollte den Quellcode haben!)
Meine eigentliche Projektdatei lautet wie folgt:
Jetzt muss ich ai_main.cpp
sie in eine dynamische Linkbibliothek kompilieren. Die Schwierigkeit besteht darin (es scheint nach Abschluss nicht schwierig zu sein): Es ai_main.cpp
werden nicht nur andere Dateien im selben Verzeichnis aufgerufen, sondern auch Quellcodedateien ( opencv
usw.) in anderen Pfaden.
Schritt 2: Gemeinsam genutzte Bibliotheken generieren
Verwenden Sie C++
einen Compiler, um den Quellcode in eine gemeinsam genutzte Bibliothek zu kompilieren. Ich verwende aarch64-mix210-linux-g++
hier die Kompilierungs-Toolkette:
build
Erstellen Sie einen Ordner mit dem Namen „ “ im selben Verzeichnis , das zum Erstellen der Zieldateien und.so
-dateien verwendet wird. Öffnen Sie ein Befehlszeilenterminal und geben Sie das Verzeichnis ein.
mkdir build && cd build
- Führen Sie den folgenden Befehl aus, um alle abhängigen
cpp
Dateien in Zieldateien (.o
Dateien) zu kompilieren:
aarch64-mix210-linux-g++ -c -fPIC -I/home/data/ai/opencv/include -I/home/data/ai/Ascend/ascend-toolkit/5.10.t20.0.b200/arm64-lmixlinux200/aarch64-linux/include ../*.cpp
-c
Die Option weist den Compiler an, ohne Verknüpfung zu kompilieren.
-fPIC
Die Option gibt an, dass positionsunabhängiger Code generiert wird, der zum Erstellen gemeinsam genutzter Bibliotheken erforderlich ist.
-I
Die Option gibt das Header-Dateiverzeichnis an. Wenn cpp
die Header-Datei in anderen Dateien verwendet wird, muss sie zu dieser Option hinzugefügt werden.
Geändert am 20. September 2023: Optimierungsparameter wurden hinzugefügt, um die Aufrufzeit der anschließend generierten so-Bibliothek zu reduzieren.
aarch64-mix210-linux-g++ -c -fPIC -I/home/data/ai/opencv/include -I/home/data/ai/Ascend/ascend-toolkit/5.10.t20.0.b200/arm64-lmixlinux200/aarch64-linux/include ../*.cpp -O3 -flto -funroll-loops -finline-functions
- Führen Sie den folgenden Befehl aus, um die Objektdatei als gemeinsam genutzte Objektdatei zu verknüpfen
.so
:
aarch64-mix210-linux-g++ -shared -o libmy_main.so *.o
-shared
Option bedeutet, gemeinsam genutzte Bibliotheksdateien zu generieren.
-o
Die Option gibt den Namen der Ausgabedatei an.
Geändert am 20. September 2023: Optimierungsparameter wurden hinzugefügt, um die Aufrufzeit der anschließend generierten so-Bibliothek zu reduzieren.
aarch64-mix210-linux-g++ -shared -o libmy_main.so *.o -O3 -flto -funroll-loops -finline-functions
Sobald Sie fertig sind, finden Sie build
die generierten libmy_main.so
Dateien im Ordner „ “. Hierbei handelt es sich um gemeinsam genutzte Bibliotheken, die von anderen zum dynamischen Verknüpfen verwendet werden können.
Im obigen Befehl können Sie ihn durch Ihr eigenes Kompilierungstool (z. B. g++
) ersetzen und müssen den Dateinamen und den Pfad entsprechend der tatsächlichen Situation ändern. Wenn der Code außerdem Abhängigkeiten von anderen Bibliotheken aufweist, müssen Sie beim Kompilieren/Verknüpfen sicherstellen, dass diese Bibliotheken installiert und die relevanten Optionen korrekt konfiguriert sind.
Schritt 3: Überprüfen Sie die generierte SO-Datei
Stellen Sie sicher, dass die generierte SO-Datei verfügbar ist, indem Sie den folgenden Befehl ausführen:
file libmy_main.so
Dies sollte etwa Folgendes anzeigen:
libmy_main.so: ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked, not stripped
so
Datei erfolgreich generiert.
Überprüfen Sie symbolische Links:
Führen Sie den folgenden Befehl aus und stellen Sie sicher, dass die Ausgabe die Definition der Funktion enthält, die Sie anschließend aufrufen müssen.
nm libmy_main.so | grep ai_track
Die Ausgabe ähnelt der:
0000000000061218 T ai_track
Die obigen Ergebnisse zeigen, dass die Funktion ai_track
in der generierten gemeinsam genutzten Bibliothek libmy_main.so
sichtbar ist . Dies bedeutet, dass die Definition der Funktion in der gemeinsam genutzten Bibliothek vorhanden ist. ai_track
Es muss durch eine eigene externe Schnittstellenfunktion ersetzt werden, bei der es sich um so
eine Funktion handelt, die von anderen Programmen aufgerufen wird.
Rufen Sie die C++ Dynamic Link Library auf
Jetzt zeigen wir, wie man C++
die generierte C++
Dynamic Link Library in einem anderen Programm aufruft. Ich habe dies zu Testzwecken getan, indem ich den kompilierten Teil des ursprünglichen Quellcodes durch den durch den Aufruf generierten ersetzt habe so
.
Schritt 1: Ändern Sie das ursprüngliche Makefile
# 注释掉原来调用原代码部分
# SMP_SRCSCPP += $(wildcard $(PWD)/../media/ai/src/*.cpp)
# 添加共享库的头文件和库路径
COMM_INC += -I/home/ai/src/build/include
CFLAGS += -L/home/src/build/lib
# 添加共享库的链接标志,例如 libmy_main.so
CFLAGS += -lmy_main
# 如果共享库是C++库,添加C++编译器标志
CFLAGS += -lstdc++
Darunter:
COMM_INC += -I/home/ai/src/build/include
: Das Verzeichnis enthält so
die Header-Datei der bereitgestellten Funktionsschnittstelle, die direkt im Quellcode wiederverwendet werden kann ai_main.h
;
CFLAGS += -L/home/src/build/lib
: Stellen Sie sicher, dass der in der Option -L angegebene Pfad der gemeinsam genutzten Bibliothek korrekt ist und libmy_main.so
das Verzeichnis enthält, das die erforderliche Freigabe enthält Bibliothek;:
CFLAGS += -lmy_main
Im Allgemeinen sollten Shared-Library-Namen aus lib
dem Präfix und .so
Suffix entfernt werden. In diesem Fall libmy_main.so
sollte es sein -lmy_main
;
Schritt 2: Kompilieren Sie das aufrufende Programm
Hier kompiliere ich direkt basierend auf dem Original neu:
make clean && make -j4
Nach Abschluss des Vorgangs wird eine ausführbare Datei generiert. Die ausführbare Datei ist hier vorübergehendrun_main
Schritt 3: Führen Sie das aufrufende Programm aus
Beim Ausführen run_main
der Datei müssen Sie so
den Pfad der Dynamic Link Library angeben
export LD_LIBRARY_PATH=/path/to/your/library:$LD_LIBRARY_PATH
Alternativ können Sie die Laufzeitverknüpfung verwenden:
run_main -rpath /path/to/your/library
Dadurch wird der Suchpfad für gemeinsam genutzte Bibliotheken für die Anwendung zur Laufzeit angegeben.
Unabhängig davon, für welche Methode Sie sich entscheiden, stellen Sie sicher, dass die Pfade zu Ihren gemeinsam genutzten Bibliotheken richtig festgelegt sind, damit Ihre Anwendung die erforderlichen gemeinsam genutzten Bibliotheken korrekt finden und laden kann.
Zusammenfassen
In diesem Artikel wird beschrieben, wie Sie C++
eine dynamische Linkbibliothek ( so
Datei) erstellen und wie Sie C++
die Bibliothek aus einem anderen Programm laden und aufrufen. Dieser Artikel basiert hauptsächlich auf dem eigenen Projekt des Autors und der Prozess ist möglicherweise nicht auf jeden anwendbar.
Wenn die Lektüre dieses Artikels für Sie nützlich ist, können Sie sich gerne mit einem Klick mit uns verbinden! ! !
5. September 2023 14:25:02