Ich habe irgendwo gehört, dass alle Windows-.DLLs Muss Definitionen für jedes Symbol enthalten sie verweist, so dass eine DLL-Datei wie dies würde nie kompilieren, da es nicht bar()
nicht implementiert.Compile .dll mit einigen undefinierte Referenzen mit MinGW
void bar();
__declspec(dllexport)
void foo() {
bar();
}
Ich denke, die Analogie ist, dass .DLLs ist im Wesentlichen Executables mit einem anderen Einstiegspunkt, so müssen sie alle definierten Bezug genommen wird, wie eine ausführbare Datei.
Aber in einer Unix-Umgebung kann ich dies zu einer .so-Datei ohne Probleme kompilieren. Ich kann dann dlopen(path, RTLD_NOW | RTLD_GLOBAL);
von der Host-Anwendung verwenden, um die Bibliothek zu laden und die Symbole des Hosts mit denen der Bibliothek zusammenzuführen. Wenn der Host bar()
definiert, ruft die Bibliothek diese Funktion einfach auf.
Ich kann nicht einfach alles in die .DLL-Datei neu definieren, weil die Bibliothek in meiner Anwendung Tausende von Symbolen vom Host verwendet. Kann man mit MinGW oder möglicherweise Visual C++ wirklich kein Symbol vom Host verwenden, indem man es in der .DLL undefiniert lässt und beim Laden zusammenfügt? Ich möchte auch nicht Tausende von Callback-Funktionen in der .DLL setzen, weil das mit C++ - Methoden schwierig wird.
Sie gehört zu Unrecht kompilieren. Eine Windows-DLL kann ein Symbol aus der ausführbaren Datei verwenden, die es lädt, obwohl es etwas ungewöhnlich ist. Sie exportieren die Funktion einfach aus der ausführbaren Datei (z. B. mit '__declspec (dllexport)') und importieren sie in die DLL (z. B. mit '__declspec (dllimport)'). –
... obwohl ich jetzt daran denke, weiß ich nicht, ob MinGW das unterstützt. Ich verstehe nicht, warum es * nicht *, aber ich weiß es nicht. –
Ich bin bereit, Visual C++ bei Bedarf zu verwenden, aber ich bin nur froh, dass dies möglich ist. Ich lese noch einmal, wie 'dllimport' funktioniert, weil ich beim letzten Mal etwas falsch verstanden habe. – Vortico