Generieren und rufen Sie die C++ Dynamic Link Library (so-Datei) auf


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:
Fügen Sie hier eine Bildbeschreibung ein
Jetzt muss ich ai_main.cppsie in eine dynamische Linkbibliothek kompilieren. Die Schwierigkeit besteht darin (es scheint nach Abschluss nicht schwierig zu sein): Es ai_main.cppwerden nicht nur andere Dateien im selben Verzeichnis aufgerufen, sondern auch Quellcodedateien ( opencvusw.) 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:

  1. buildErstellen 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
  1. Führen Sie den folgenden Befehl aus, um alle abhängigen cppDateien in Zieldateien ( .oDateien) 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

-cDie Option weist den Compiler an, ohne Verknüpfung zu kompilieren.
-fPICDie Option gibt an, dass positionsunabhängiger Code generiert wird, der zum Erstellen gemeinsam genutzter Bibliotheken erforderlich ist.
-IDie Option gibt das Header-Dateiverzeichnis an. Wenn cppdie 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
  1. 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

-sharedOption bedeutet, gemeinsam genutzte Bibliotheksdateien zu generieren.
-oDie 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 builddie generierten libmy_main.soDateien im Ordner „ “. Hierbei handelt es sich um gemeinsam genutzte Bibliotheken, die von anderen zum dynamischen Verknüpfen verwendet werden können.
Fügen Sie hier eine Bildbeschreibung ein

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

soDatei 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_trackin der generierten gemeinsam genutzten Bibliothek libmy_main.sosichtbar ist . Dies bedeutet, dass die Definition der Funktion in der gemeinsam genutzten Bibliothek vorhanden ist. ai_trackEs muss durch eine eigene externe Schnittstellenfunktion ersetzt werden, bei der es sich um soeine 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 sodie 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.sodas Verzeichnis enthält, das die erforderliche Freigabe enthält Bibliothek;:
CFLAGS += -lmy_mainIm Allgemeinen sollten Shared-Library-Namen aus libdem Präfix und .soSuffix entfernt werden. In diesem Fall libmy_main.sosollte 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_mainder Datei müssen Sie soden 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 ( soDatei) 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
Fügen Sie hier eine Bildbeschreibung ein

Acho que você gosta

Origin blog.csdn.net/JulyLi2019/article/details/132686129
Recomendado
Clasificación