1. Kapselung der dynamischen Bibliothek
1. Erstellen Sie zunächst ein neues Bibliotheksprojekt
2. Ändern Sie den Typ in eine gemeinsam genutzte Bibliothek und passen Sie den Projektnamen und den Projektpfad an
3. Wählen Sie den Compiler aus
4. Wählen Sie die für die dynamische Bibliothek erforderlichen Module aus
5. Passen Sie den Klassennamen an und klicken Sie auf Weiter
6. Klicken Sie auf Weiter
7. Projektübersicht
8. Derzeit ist keine UI-Datei in der Datei vorhanden, da Sie zum Kapseln der dynamischen Bibliothek mit der Schnittstelle mit der rechten Maustaste auf das Projekt klicken -> Neu hinzufügen müssen
9. Wählen Sie im neuen Popup-Fenster Qt -> Qt-Designer-Schnittstellenklasse
10. Wählen Sie die Widget-Schnittstellenvorlage aus
11. Benennen Sie es mit demselben Namen wie das aktuelle Projekt, um die vorherige Datei ohne UI-Schnittstelle zu überschreiben
12. Klicken Sie auf Fertig stellen
13. Danach werden die folgenden beiden Fenster angezeigt. Klicken Sie auf „OK“ bzw. „Ja für alle“.
14. An diesem Punkt können Sie sehen, dass sich unter der Projektdatei weitere .ui-Dateien befinden
15. Klicken Sie auf die .pro-Datei, um doppelte Inhalte zu löschen
16. Wenn in der Datei Rot angezeigt wird, bedeutet dies, dass einige Module fehlen (das Widgets-Modul fehlt).
17. Fügen Sie Folgendes hinzu, der Fehler kann verschwinden
18. Allerdings kann das Projekt derzeit nicht direkt in eine dynamische Bibliothek gepackt werden, da die alte Datei überschrieben wird und die neue Datei nicht in eine dynamische Bibliothek gepackt werden kann, sodass die neue Datei geändert werden muss
I. Zu diesem Zeitpunkt lautet der Inhalt der neuen DynamicLib.h-Datei wie folgt:
II. Sie muss in den folgenden Inhalt geändert werden:
Es ist erforderlich, eine Header-Datei hinzuzufügen #include "dynamiclib_global.h"
und vor dem Klassennamen eine Anweisung hinzuzufügen DYNAMICLIBSHARED_EXPORT
.
III. DYNAMICLIBSHARED_EXPORT
Die Anweisung kann direkt in die Header-Datei kopiert werden dynamiclib_global.h
, das ist der Teil, der im folgenden Code durch das rote Kästchen eingekreist ist:
19. Fügen Sie dieser Schnittstelle eine Schaltfläche hinzu und fügen Sie dieser Schaltfläche die entsprechende Slot-Funktion hinzu
20. Schreiben Sie den Inhalt der Slot-Funktion
21. Klicken Sie dann auf „Erstellen und ausführen“, um eine dynamische Bibliotheksdatei zu generieren
22. Die generierte Bibliotheksdatei befindet sich in einem eigenen Debug-Ordner
23. Eine weitere Datei, die verwendet werden muss, ist eine eigene Header-Datei, dynamiclib_global.h
die ebenfalls mitgebracht werden muss
Zu diesem Zeitpunkt ist die Kapselung der dynamischen Bibliothek abgeschlossen und die zu verwendenden Dateien sind die vier oben markierten.
Zweitens der Aufruf der dynamischen Bibliothek: Verwenden Sie diese dynamische Bibliothek in einem anderen neuen Projekt
1. Erstellen Sie ein neues Projekt mit Schnittstelle
2. Projektübersicht
3. Fügen Sie dann zwei neue Ordner include und lib im LibTest-Projektverzeichnis des Projekts hinzu
- Legen Sie die Dateien
DynamicLib.h
und im Ordner abdynamiclib_global.h
include
- wird im Ordner
DynamicLib.lib
abgelegtlib
4. Fügen Sie dann die folgende Anweisung in die Datei LibTest.pro ein, um die dynamische Bibliothek zu importieren
INCLUDEPATH += $$PWD/include
LIBS += -L$$PWD/lib -lDynamicLib
Es zeigt den von der dynamischen Bibliothek benötigten Header-Dateipfad, den Pfad, in dem sich die dynamische Bibliothek befindet, und den Namen der dynamischen Bibliothek an. $$PWD gibt das Projektverzeichnis an und -l gibt den Namen der Bibliotheksdatei ohne das Suffix .lib an.
Fügen Sie dann die Header-Dateien hinzu, die in den Dateien verwendet werden müssen, die von der dynamischen Bibliothek verwendet werden.
5. Beginnen Sie dann mit der Bearbeitung von mainwindow.ui
Fügen Sie eine StackedWidget-Komponente hinzu, fügen Sie eine Schaltfläche auf der ersten Seite ein, klicken Sie auf diese Schaltfläche, springen Sie zur zweiten Seite und platzieren Sie die gekapselte dynamische Bibliotheksschnittstelle auf der zweiten Seite.
6. Fügen Sie zunächst eine Slot-Funktion zu pushButton hinzu
7. Fügen Sie dann ein DynamicLib-Objekt in MainWindow hinzu und importieren Sie die Header-Datei der dynamischen Bibliothek
8. Fügen Sie den folgenden Code im Konstruktor hinzu
9. Zu diesem Zeitpunkt tritt ein Problem auf: Das Programm wird abnormal beendet und kann nicht erfolgreich ausgeführt werden
10. Dies liegt daran, dass es eine andere Datei gibt, die nicht verwendet wird, nämlich die DLL-Datei, und DynamicLib.dll
die Datei in einem Ordner auf derselben Ebene abgelegt werden muss LibTest.exe
, da das Programm sonst die dynamische Bibliothek beim Ausführen nicht findet das Programm wird abstürzen
Da dies die Debug-Phase ist, befindet sich die Datei LibTest.exe im Debug-Ordner. Legen Sie die DLL daher hier ab:
Auf die gleiche Weise kann die DLL nach dem Packen der Version immer noch im selben Verzeichnis wie die Exe-Datei abgelegt werden.
11. Dann neu erstellen und ausführen
Das Programm startet erfolgreich:
12. Klicken Sie auf die Schaltfläche, um zur zweiten Schnittstelle zu springen
13. Klicken Sie erneut auf die Testschaltfläche
Sie können sehen, dass die Zeichenfolge unten gedruckt wird Dynamic Link Lib Test!!!
, was darauf hinweist, dass die dynamische Bibliothek normal aufgerufen werden kann.
3. Ergänzung: Einfache Methode
Wenn es jetzt einen GUI-Prozess mit dem Namen CustomMessageBox gibt und Sie ihn in eine DLL ändern möchten, müssen Sie die folgenden Änderungen vornehmen ( beachten Sie, dass der rote Teil der Großbuchstabe des Klassennamens ist und Sie den Inhalt des ändern müssen roter Textteil entsprechend der tatsächlichen Situation. ):
1. Ändern Sie die Konfigurationsdatei
1 #TEMPLATE = app
2
3 DEFINES += CUSTOMMESSAGEBOX _LIBRARY
4 TEMPLATE = lib
2. Fügen Sie den folgenden Code zur Header-Datei der exportierten Klasse hinzu
1 #wenn definiert( CUSTOMMESSAGEBOX _LIBRARY)
2 # CUSTOMMESSAGEBOX SHARED_EXPORT Q_DECL_EXPORT definieren
3 #else 4 # CUSTOMMESSAGEBOX SHARED_EXPORT Q_DECL_IMPORT
definieren 5 #endif
3. Ändern Sie die Definition der Exportklasse
1 //Klasse CustomMessageBox: öffentlicher QDialog
2 Klasse CUSTOMMESSAGEBOX SHARED_EXPORT CustomMessageBox: öffentlicher QDialog
4. Kompilieren
Wenn es sich um einen Compiler handelt , finden Sie nach der Kompilierung Dateien MinGW32
im Ordner „and“ ; wenn es sich um einen Compiler handelt, sollte es „ and“ sein .***.dll
***.a
MSVC
***.dll
***.lib
5. Verwendung
Erstellen Sie in dem Programm, das diese Bibliothek verwendet, einen neuen include
Ordner, kopieren Sie ***.a
die Datei 导出类的头文件
in diesen Ordner und importieren Sie die Header-Datei in das Programm. Legen Sie nach dem Kompilieren dll
die in verschiedenen Modi kompilierten Dateien in den Ordner nach dem Kompilieren des Programms ab, damit das Programm normal ausgeführt werden kann.