Wie verwenden von delay laden, mit einer DLL für den Export von C++ - Klassen
Ich habe eine DLL one.dll
verwendet, die eine Klasse TwoClass
exportiert aus two.dll
über class __declspec(dllexport)
. Ich möchte one.dll
zu verwenden /delayload
für two.dll
, aber ich bekomme Linker-Fehler:
LINK : fatal error LNK1194: cannot delay-load 'two.dll' due to import
of data symbol '"__declspec(dllimport) const TwoClass::`vftable'"
(__imp_??_7TwoClass@@6B@)'; link without /DELAYLOAD:two.dll
Dass in einem Release-build; in einem Debug-build funktioniert es. (Ich weiß nicht, was der Unterschied zwischen Release und Debug in Bezug auf die vtable-Export, noch kann ich irgendwelche compiler-switches oder pragmas zu kontrollieren.)
Wie kann ich /delayload
mit einer DLL, die Export-Klassen, wie dies in einem Release-build?
- VC6 durch Zufall?
- Nein, VS2005 (derzeit; zu bewegen, um 2010 irgendwann).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie einen Blick hier, scheint, dass die person genau das gleiche problem hatte und fand einen workaround
Remove unreferenced code and data
option auf Nicht erlaubt, mich zu halten, die Optimierung aktiviert ist. VerweisÜberprüfen Sie, ob one.dll enthält eine source-Datei mit TwoClass.hxx aber nicht wirklich zu nutzen. Zusätzlich überprüfen Sie, ob TwoClass die Voraussetzungen für die vom compiler generierten Methoden (siehe Bedingungen für die automatische Generierung).
In meinem Fall, den ich eigentlich nicht brauchen, zu einem compiler-generierte copy-ctor noch der Zuweisungsoperator für TwoClass so erklärte ich Ihnen in der
private:
Abschnitt ohne Angabe einer definition. Erstellt build-Fehler für one.dll, die mich geleitet haben, um die source-Dateien, die unnötig im Lieferumfang enthalten TwoClass.hxx. Nach dem entfernen der unnötigen umfasst, war ich in der Lage zu kompilieren und verknüpfen die Optimierung eingeschaltet und mit /delayload.Ich gehe davon aus, dass die unnötige
#include
Aussagen fehlgeleitet, dass der Optimierer kopieren Sie den vom compiler generierten Methoden für TwoClass in die .obj-Dateien werden eingebunden one.dll obwohl Sie nicht verwendet wurden, in diese .obj-Dateien. Diese unnötigen compiler generierten Methoden für TwoClass scheinen zu verhindern, dass eine Verknüpfung mit /delayload.Definieren Sie eine factory-Funktion, die die Hände von Instanzen einer Klasse, ähnlich wie in COM. Dies erfordert auch, dass die Schnittstelle(s) von den Klassen öffentlich sein, aber das ist auch gegeben, wenn jemand importiert eine Klasse.
__declspec(dllexport)
auf eine Klasse ist eine schreckliche Idee, viel besser, setzen die Schnittstelle ein, und lassen Sie die Implementierungsdetails bleiben verborgen, im inneren der module.delayload
?Ich hatte genau das gleiche problem mit einer Klasse, die enthaltenen inline-Implementierung für die zu exportierenden Klasse.
Habe ich verschoben inline-Implementierung zu .cpp - Datei, danach funktionierte alles reibungslos.