maddin Geschrieben 28. November 2006 Teilen Geschrieben 28. November 2006 Hi, ich habe ein kleines Problem. Ich schreibe eine DLL. Aus dieser möchte ich Klassen exportieren. Dazu verwende ich entsprechend __declspec(dllexport) bzw. __declspec(dllimport). Habe das über eine AFX_EXT_CLASS entsprechende Makro gelöst. Das Problem dabei: Ich kann nur eine Klasse exportieren. Bei jeder anderen Klasse, die ich exportieren möchte bekomme ich vom Linker die Fehlermeldung « main.obj : error LNK2001: Nichtaufgeloestes externes Symbol "__declspec(dllimport) public: __thiscall GWS::SoapClient::~SoapClient(void)" ... » Die Frage nun: Warum funktioniert das bei der einen Klasse, bei der anderen aber nicht obwohl ich beide Klassen gleich deklariert habe? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 28. November 2006 Teilen Geschrieben 28. November 2006 Hmm also Grundsätzlich klappt das auch mit mehreren Klassen, deshalb kann ich dir da jetzt nur sagen das du entweder nochmal genau drüber schaust ob du irgendwo was vergessen hast oder die entsprechenden Stellen hier postest. PS: Ich hab hier mal gehört das das exportieren von Klassen problematisch ist wenn du für die DLL und die importierende Anwendung verschiedene Compiler benutzt, weil es da wohl keinen festen Standard gibt und das von Compiler zu Compiler unterschiedlich sein kann wie das genau gemacht wird. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 28. November 2006 Teilen Geschrieben 28. November 2006 Ist SoapClient die exportierte Klasse? Hast du den Destruktor selbst deklariert? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
maddin Geschrieben 28. November 2006 Autor Teilen Geschrieben 28. November 2006 SoapClient ist eine der zu exportierenden Klassen. Vieleicht noch mal ein wenig Code: #ifdef WIN32 #ifdef GENERICWEBSERVER_EXPORTS #define GENERIC_WEB_SERVER_API __declspec(dllexport) #else #define GENERIC_WEB_SERVER_API __declspec(dllimport) #endif #else #define GENERIC_WEB_SERVER_API /* GENERIC_WEB_PAGE_API not defined for unix */ #endif namespace GWS { class GENERIC_WEB_SERVER_API GenericWebServer : public Concurrency::Thread, public SoapServer { //... } class GENERIC_WEB_SERVER_API SoapClient { //... } } Oben ist das für den Export verwendete Makro, unten zwei der Klassen, die exportiert werden sollen. Das Makro ist jeweils nur vor der Klassendeklaration angegeben. Bei der ersten Klasse scheint alles einwandfrei zu funktionieren. Zumindest läuft es wie gewollt und ich erhalte auch keine Fehlermeldungen vom Compiler/ Linker. Bei der zweiten Klasse 'SoapClient' werden alle Methoden als 'Nichtaufgelöstes externes Symbol' vom Linker angemeckert, die ich im einbindenden Programm verwende (bei mir: Konstruktor, Destruktor und invoke). Alle Methoden sind aber im entsprechenden cpp-File implementiert. Das selbe Problem erhalte ich bei allen anderen Klassen, die ich versuche zu exportieren. Unstimmigkeiten beim verwendeten IDE bzw. Schreibfehler würde ich eigentlich ausschließen. Verwendete für alle Projekte Visual Studio C++ 6.0, wobei ich mir die Klassen von Rational Rose 2003 hab generieren lassen. PS: Wenn ich z.B. innerhalb einer Methode in GenericWebServer die Klasse SoapClient verwenden möchte, läuft im übrigen alles einwandfrei durch den Compiler und Linker. Also müsste es eigentlich irgendwo am Export liegen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
maddin Geschrieben 28. November 2006 Autor Teilen Geschrieben 28. November 2006 Habs beide Projekte - DLL und einbindendes Programm - noch einmal als Release erstellt. Dabei habe ich den Fehler der nichtaufgelösten externen Verweise bei Methoden beider Klassen erhalten. :confused: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 28. November 2006 Teilen Geschrieben 28. November 2006 Du verlinkst dein Programm nicht zufällig mit einer veralteten Version der .lib (oder gar überhaupt nicht)? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
maddin Geschrieben 28. November 2006 Autor Teilen Geschrieben 28. November 2006 Ok, das zweite Problem scheint gelöst. Bleibt aber immer noch die Frage, warum ich Klasse A exportieren kann und Klasse B nicht. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 28. November 2006 Teilen Geschrieben 28. November 2006 Also ein Kollege hatte vor kurzem ein ähnliches Problem weil er bei der Implemantation der Methode in der Cpp Datei den Klassennamen vor der Funktion vergessen hatte, aber da du das Problem ja mit mehreren Klassen hast gehe ich nicht davon aus das du das überall vergessen hast Benutzt du die selbe Headerdatei für den Import der Klassen in deine Anwendung wie die für den Export da oben? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 28. November 2006 Teilen Geschrieben 28. November 2006 Was passiert, wenn du die Reihenfolge der Klassen in der Headerdatei vertauschst? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
maddin Geschrieben 28. November 2006 Autor Teilen Geschrieben 28. November 2006 Der angegebene Code oben sind Ausschnitte aus drei Header-Dateien. Habe eine utility.h in der u.a. das Makro definiert ist. Darüber wird ja geregelt ob ich __declspec(dllexport) oder __declspec(dllimport) nutze. Und jede der Klassen befindet sich in einer eigenen Datei, die jeweils die utility.h einbindet. Die beiden Datei werden eben vom zugehörigen cpp-File (Implementierung) und von Programm, dass die DLL nutzt, eingebunden. Ein vertauschen der Header-Reihenfolge in diesem Programm ändert nichts. Also ein Kollege hatte vor kurzem ein ähnliches Problem weil er bei der Implemantation der Methode in der Cpp Datei den Klassennamen vor der Funktion vergessen hatte, aber da du das Problem ja mit mehreren Klassen hast gehe ich nicht davon aus das du das überall vergessen hast Wovon ich auch nicht ausgehe, da ich mir das Grundgerüst meiner Klasse von Rational Rose hab erstellen lassen. Außerdem kann ich die Klassen innerhalb der DLL ohne Probleme nutzen. Was ja dann auch nicht möglich wäre. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.