Exportieren von Klassen, die std::-Objekte enthalten, aus einer DLL
Beim Exportieren von Klassen, die Objekte wie std::vectors und std::strings enthalten, aus eine DLL, eine Warnung, wie zum Beispiel „class 'std::map<_Kty,_Ty>' benötigt eine DLL-Schnittstelle, die von Clients der Klasse „FontManager“ verwendet werden soll. Diese Warnung weist darauf hin, dass die Mitgliedstypen der Klasse eine DLL-Schnittstelle erfordern, damit der Clientcode darauf zugreifen kann.
Deklaration von Standardcontainern weiterleiten
Um dieses Problem zu beheben, leiten Sie weiter Klassendeklarationen mit DLL_EXPORT können vor den Mitgliedsvariablen platziert werden, wie unten gezeigt:
template class DLL_EXPORT std::allocator<tCharGlyphProviderRef>; template class DLL_EXPORT std::vector<tCharGlyphProviderRef,std::allocator<tCharGlyphProviderRef> >; std::vector<tCharGlyphProviderRef> m_glyphProviders;
Dieser Ansatz entfernt zwar möglicherweise Warnungen, tut dies aber garantiert nicht die Verfügbarkeit der DLL-Schnittstelle für Mitgliedsfunktionen.
Anforderungen an die DLL-Schnittstelle
Um die ordnungsgemäße DLL-Funktionalität sicherzustellen, müssen Klassen und ihre Mitgliedsfunktionen über eine DLL-Schnittstelle verfügen. Das bedeutet, dass der Compiler die Funktion innerhalb der DLL selbst generiert und sie somit importierbar macht. Wenn diese Schnittstelle nicht für Mitglieder bereitgestellt wird, auf die über Client-Code zugegriffen werden kann, führt dies zu Warnungen oder Fehlern beim Kompilieren oder Verknüpfen.
Private Mitglieder und Warnungen
Private Mitglieder sind für Clients nicht zugänglich kann von DLL_EXPORT-Deklarationen ausgenommen werden. Warnungen für solche Mitglieder können deaktiviert werden. Bei vom Compiler generierten Destruktoren und Konstruktoren ist jedoch Vorsicht geboten.
DLL-Exportable Member Handling
Member, die von Clients verwendet werden müssen, erfordern Folgendes:
Instanziierung von Template-Klassen
Weiterleitungsdeklarationen von Template-Klassen mit DLL_EXPORT erzeugen nur Instanziierungen innerhalb der aktuellen Kompilierungseinheit. Dieser Ansatz reicht für Nicht-Vorlagenklassen nicht aus.
Das obige ist der detaillierte Inhalt vonWie exportiere ich Klassen, die std::-Objekte enthalten, aus einer DLL?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!