c++ DLL Export am beispiel boost
-
Hallo zusammen.
Wenn ich eine Win32 dll erstelle und möchte alle Klassen und Funktionen einer anderen exe oder auch DLL bereit stellen muss ich ja die Klassen / Funktionen / Variablen mit _declspec(dllexport) exportieren.
Wie macht das z.B boost. Wenn ich mir hier z.B ein boost packet über nuget ziehe liegt ja auch zur .lib eine .dll bereit.
Aber in den Header Files sehe ich nirgends ein dllexport bzw. das entsprechende Makro.
Ok ihr sagt nun das gehört nicht ins c++ iso Forum. weil es Windows Funktionalität ist. Aber es geht ja auch um boost.
Oder was nutzt hier boost um seine funktionen aus dlls zu exportieren?
-
Bei welcher Boost-Library hast du geschaut?
Viele sind Header-Only, da ist da nicht nötig.
Ansonsten benutzen die Boost-Libraries schon irgendein Mechanismus, um Klassen/Funktionen zu exportieren.
edit/1
Wenn man sich z. B. die Header von boost/program_options anschaut, kommt man über Umwege zur Datei
boost/config/platform/win32.hpp
, woBOOST_SYMBOL_EXPORT
als__declspec(dllexport)
undBOOST_SYMBOL_IMPORT
als__declspec(dllimport)
definiert ist.
-
Hallo theta
Danke für deine Antwort.
Ok ich habe bei boost_serialization geschaut. Ich habe mir halt einige Funktionen oder Strukturen angeschaut und kein Makro gesehen.
Header Only heißt dann dass die Kunktionen dann nicht dynamisch geladen werden sondern statisch in die enstprechende exe bzw dll compiliert werden.
Dann wird der Code also mehrfach in den Speicher geladen wenn er von unterschiedlichen DLLs verwendet wird?
Mein Hintergund ist der: Ich möchte Funktionalitäten in librarys auslagern. Nun stellt sich die Frage Static Lib oder DLL. Der Vorteil einer DLL ist ja dass selber Code nur einmal geladen wird. Egal wie oft er verwendet wird.
Allerdings bin ich da auch wiederum eingeschränkt. Ich habe z.B. eine Template basierte Singleton Klasse. Diese hat wiederum eine statische Variable. Bekanntermassen lassen sich statische Member nicht exportieren. Hier aber zwingend notwendig.
Eigentlich bin ich in c# unterwegs. Da kenne ich diesese Probleme ob nun static Lib oder Dynamic Lib nicht.
-
boost_dll schrieb:
Header Only heißt dann dass die Kunktionen dann nicht dynamisch geladen werden sondern statisch in die enstprechende exe bzw dll compiliert werden.
Ja.
boost_dll schrieb:
Dann wird der Code also mehrfach in den Speicher geladen wenn er von unterschiedlichen DLLs verwendet wird?
Ja.
Wobei du in modernem C++ sowieso meist Code hast der "mehrfach in den Speicher geladen" wird. Weil du typischerweise bestimmte Dinge im Header File implementierst, damit sie der Compiler inline erweitern kann.
Diese Teile werden dann auch "mehrfach in den Speicher geladen", trotz dem die Klasse aus einer DLL exportiert wird.boost_dll schrieb:
Mein Hintergund ist der: Ich möchte Funktionalitäten in librarys auslagern. Nun stellt sich die Frage Static Lib oder DLL. Der Vorteil einer DLL ist ja dass selber Code nur einmal geladen wird. Egal wie oft er verwendet wird.
Ja.
Wobei das selten besonders wichtig ist. Wie viel GB RAM hat dein PC? Wie viel MB haben alle deine DLLs?boost_dll schrieb:
Allerdings bin ich da auch wiederum eingeschränkt. Ich habe z.B. eine Template basierte Singleton Klasse. Diese hat wiederum eine statische Variable. Bekanntermassen lassen sich statische Member nicht exportieren. Hier aber zwingend notwendig.
Tja mit Templates wirst du nicht weit kommen. Templates sind kein Code, sondern nur die Vorlange für Code. Und die kann man nicht exportieren.
Die Sache mit deinem Singleton lässt sich aber sicherlich auch anders lösen.
z.B. indem man kein Singleton verwendet, aber so mein ich das nichtmal, es geht auch mit Singletons und DLLs.
Es muss ja z.B. nicht jeder der das Foo Singleton willSingleton<Foo>::instance()
schreiben. Statt dessen könnte man ja auchFoo::instance()
odergetFooSingleton()
schreiben. Damit sind das normale Memberfunktionen/Funktionen, und die kannst du ganz normal exportieren.