DLL Dateien mit C++ Code exportieren / nutzen
-
Hallo
Ich möchte gerne eine DLL Datei erstellen und in einem anderen Project nutzen. Wie das geht weiß ich bereits.
Ich stoße dabei nur auf folgendes Problem:Mir gelingt es nur reine C - Funktionalitäten zu exportieren und zu nutzen. Versuche ich C++ Funktionalitäten (also eine Funktion, die auch std::vector und solch Kram nutzen kann) zu nutzen, kann ich zwar eine DLL bauen, aber ich kriege Schwierigkeiten bei dem Versuch diese mit GetProcAddress() auch anzusprechen, weil der 2. Parameter scheinbar kein klar definierter Funktions-String mehr ist.
Ich möchte das später natürlich auch auf Linux (mit .so Dateien) ebenfalls nutzen können.
Frage also:
Wie spreche ich C++ Funktionalitäten aus der DLL richtig an?
Vielen Dank schon mal!
-
Möchtest du denn die DLL nur von C++ aus nutzen oder aber auch mit C (oder anderen Sprachen)?
Und warum bindest du die DLL dynamisch mittels
LoadLibrary
undGetProcAddress
ein, anstatt einfach den Linker zu verwenden (und im C++-Code die passende Headerdatei einzubinden)?Erkunde dich mal über Name mangling, dann weißt du warum du nicht einfach per
GetProcAddress
exportierte C++ Funktionen (und Klassenfunktionen) aufrufen kannst.
-
@LynarStudios sagte in DLL Dateien mit C++ Code exportieren / nutzen:
Wie spreche ich C++ Funktionalitäten aus der DLL richtig an?
Kannst Du garantieren daß Library und Executable die sie verwendet immer vom selben Compiler in der exakt selben Version kommen? Ja: probiers. Nein: vergiss es.
@LynarStudios sagte in DLL Dateien mit C++ Code exportieren / nutzen:
aber ich kriege Schwierigkeiten bei dem Versuch diese mit GetProcAddress()
Das entscheidende Schlüsselwort hat Dir ja @Th69 schon gegeben. Name mangling.
Am einfachsten und kompatibelsten ist es mit einem reinen C-Interface über Library boundaries.
-
@Th69
Hey,Nein ich möchte mich auf C++ standard beschränken. Der Grund warum ich das dynamisch laden und entladen möchte ist, dass das ein größeres Projekt ist. Und nach meinem jetzigen Kenntnisstand würde ich beim direkten linken der Bibliothek diese auch die ganze Zeit im Speicher behalten - vermutlich also auch, wenn ich eine .dll.a linken würde, richtig? Oder sehe ich das falsch?
Diese spezielle Bibliothek wird aber nicht oft gebraucht und sollte deswegen nicht länger im Speicher bleiben als nötig.
Das mit dem name mangling habe ich gelesen, vielen Dank.
@Swordfish danke, das mit den "C-Interface über Library boundaries" - Thema schau ich mir mal an.
-
Hier zwei Artikel dazu: Dynamically loading classes from DLLs sowie Dynamic Class Loading for C++ on Linux
Wenn du den MSVC benutzt, dann kannst du dort auch mittels Linker Support for Delay-Loaded DLLs diese Aufgabe dem Linker überlassen, s.a. /DELAYLOAD (Delay Load Import) sowie Explicitly Unloading a Delay-Loaded DLL sowie den Artikel Delay Loading a DLL.
Für Linux (gcc) habe ich folgende Links gefunden (mich aber nicht näher damit beschäftigt):
-
@LynarStudios sagte in DLL Dateien mit C++ Code exportieren / nutzen:
Nein ich möchte mich auf C++ standard beschränken. Der Grund warum ich das dynamisch laden und entladen möchte ist, dass das ein größeres Projekt ist. Und nach meinem jetzigen Kenntnisstand würde ich beim direkten linken der Bibliothek diese auch die ganze Zeit im Speicher behalten - vermutlich also auch, wenn ich eine .dll.a linken würde, richtig?
Abgesehen von dem was Th69 geschrieben hat...
Das hört sich für mich heutzutage erstmal nach einem komischen Grund an. Der könnte natürlich schon valide sein - z.B. wenn du eine Serverapplikation schreibst, die monatelang laufen soll, ohne neugestartet zu werden, und nur ab und zu bestimmte sehr komplexe Funktionalität benötigt. So einen Fall halte ich aber für sehr unwahrscheinlich.
Ansonsten kann ich mir eher schlecht ein "größeres" Projekt vorstellen, bei dem die Größe des Codes im Arbeitsspeicher ein realistisches Problem darstellen würde.
-
Die Frage habe ich mir auch gestellt.
Schade, daß keine Antwort mehr kommt.
-
Hat Microsoft nun doch endlich Windows 10 auf den C64 portiert?
-
@hustbaer wh00t?
-
Der Grund warum ich das dynamisch laden und entladen möchte ist, dass das ein größeres Projekt ist. Und nach meinem jetzigen Kenntnisstand würde ich beim direkten linken der Bibliothek diese auch die ganze Zeit im Speicher behalten
Es muss sich also ganz klar um einen C64 handeln.
-
@hustbaer Ne. Warum?
// edit: ja, ok.
// edits tante: ach darum C64.