Heim  >  Artikel  >  Backend-Entwicklung  >  Wie exportiere ich Klassen, die std::-Objekte enthalten, aus einer DLL?

Wie exportiere ich Klassen, die std::-Objekte enthalten, aus einer DLL?

Linda Hamilton
Linda HamiltonOriginal
2024-11-16 18:52:03590Durchsuche

How to Export Classes Containing std:: Objects from a DLL?

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:

  • DLL-Export-Wrapper:Erstellen Sie Ersatzfunktionen, die aus exportiert werden DLL, die Operationen am Mitglied ausführt.
  • Indirektionsmethoden: Implementieren Sie Methoden, die dem Mitglied eine Indirektion bereitstellen, und exportieren Sie stattdessen diese Methoden.
  • PIMPL-Idiom: Verwenden Sie die Private Implementation (PIMPL)-Sprache, um die externe Sichtbarkeit von zu reduzieren Mitglieder.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn