2017-02-02 1 views
0

Ich habe die Dokumentation für Linux-Aufrufe dlopen() und dlsym() gelesen, die eine dynamische Bibliothek öffnet und jeweils ein Symbol in der Bibliothek lädt.Was bedeutet "Windows unterstützt keine ordnungsgemäße dynamische Verknüpfung?"

scheinen Diese Anrufe entspricht Windows handelt LoadLibrary() und GetProcAddress().

Ich lese "Windows unterstützt keine ordnungsgemäße dynamische Verknüpfung" in diesem Beitrag: Running LLVM passes on Windows 10 gives no output in terminal?.

Aus welchem ​​Grund unterscheiden sich dynamische Linux- und Windows-Bibliotheksaufrufe?

Ist der einzige Unterschied, dass dynamische Bibliotheken unter Linux Symbole in ausführbaren Dateien laden können? Aber das würde bedeuten, dass ausführbare Dateien auch Bibliotheken unter Linux sind, da dlopen() auf dynamischen Bibliotheken arbeitet.

Antwort

3

Windows unterstützt die richtige dynamische Verknüpfung. Der Unterschied ist, dass Windows nicht ordnungsgemäß unterstützt dynamische Verknüpfung, wo Sie eine ausführbare Datei mit einer Bibliothek verknüpfen (d. H. Der falsche Weg). Dieser Fehler ist unter Windows nicht möglich, da seine ausführbaren Dateien keine Exporttabelle haben.

Das heißt, Ihre Logik ist ein bisschen fehlerhaft. Ausführbare Dateien und dynamische Bibliotheken unterscheiden sich nicht so sehr, selbst unter Windows. LoadLibrary lädt tatsächlich ausführbare Dateien; es ist GetProcAdddress, die fehlschlägt.

Wie für die Plugin-Logik, das ist ziemlich einfach in C++ mit abstrakten (rein virtuellen) Klassen als Schnittstellen zu arrangieren.

+0

Wissen Sie, warum Windows keine Exporttabellen für seine ausführbaren Dateien auswählt? – Shuzheng

+0

Würdest du es verlinken wie das Plugin in C++ gemacht wird? – Shuzheng

+0

Ich denke, Sie meinen "wo Sie eine Bibliothek gegen eine ausführbare Datei verknüpfen". – Shuzheng

Verwandte Themen