Zum Inhalt springen

DLL Klassen exportieren


maddin

Empfohlene Beiträge

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...