Klasse aus DLL erstellen - Linkererror (MSVC)



  • Hi,

    versuche gerade eine DLL zu basteln mit einigen Klassen darin, eine Klasse soll ebenfalls von Aussen nutzbar sein.
    Nutze ich die DLL in einem Projekt in MSVC, in dem die DLL auch erstellt wurde, geht das alles wunderbar. Importiere ich die DLL aber in ein anderes Projekt enstehen Linkerfehler sobald ich auch nur versuche die Klasse anzufassen.

    Hier mal ein Beispiel wie das ganze bei mir aufgebaut ist:

    Example.dll ist ein Projekt und hat uA. folgende Dateien

    // Klasse.h
    #include <windows.h>
    #include <stdexcept>
    
    #if defined(_MSC_VER)
    #define DLL __declspec(dllexport)
    #else
    #define DLL
    #endif
    
    class DLL Klasse
    {
    	private:
    		std::string name;
    	public:
    		Klasse();
    		std::string GetHans();
    		static std::string* abc();
    };
    
    // --------------------------------------------------------
    
    //Klasse.cpp
    
    #include "Klasse.h"
    
    Klasse::Klasse()
    {
    	this->name = "klasse";
    }
    
    std::string Klasse::GetHans()
    {
    	return this->name;
    }
    
    std::string* abc()
    {
    	std::string *hans = new std::string;
    	*hans = "kjkjJ";
    	return hans;
    };
    

    So das ganze ist ja auch komplilierbar ... mache ich mir nun ein WIn32 Projekt in MSVC und binde die DLL ein (Pfad zur lib unter Options einfügen und die lib in den Projektoptionen hinzuschreiben) dann gibt es beim Komplieren sofort Linkererror sobald ich die Klasse nutzen will.
    Für den Import benutze ich eine kleine headerdatei:

    // dll.h
    
    #define __declspec(dllimport)
    
    #include <stdexcept>
    
    class DLL Klasse
    {
    		private:
    		std::string name;
    	public:
    		Klasse();
    		std::string GetHans();
    		static std::string* abc();
    };
    

    In meiner Anwendung.cpp (Konsolenappli Win32) Versuche ich nun folgendes:

    #include "stdafx.h"
    #include "windows.h"
    #include "dll.h"
    #include <stdexcept>
    #include <iostream>
    
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
            Klasse *klasse = new Klasse();
            cout << Klasse::abc() << endl;
    	system("Pause");
    	return 0;
    }
    

    Leider gibt das nen Linkererror

    error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""__declspec(dllimport) public: __thiscall Klasse::Klasse(void)" (__imp_??0Klasse@@QAE@XZ)" in Funktion "_wmain".

    Hat da vielleicht jemand eine Idee?

    Danke

    Beelze



  • Bring mal nen wenig Struktur rein ...

    my_dll.h

    #if !defined(MY_DLL_H__INCLUDED)
    #define MY_DLL_H__INCLUDED
    
    #if defined(MY_DLL)
    	#define MY_DLL_API	__declspec(dllexport)
    #else
    	#define MY_DLL_API	__declspec(dllimport)
    #endif
    
    // Required Header
    #include <string>
    
    // Dll-Parts
    #include "Class.h"
    
    #endif // MY_DLL_H__INCLUDED
    

    Class.h

    #if !defined (CLASS_H__INCLUDED)
    #define CLASS_H__INCLUDED
    
    class MY_DLL_API Class
    {
    public:
    	Class();
    	std::string&	get_hans();
    
    private:
    	std::string		m_hans;
    };
    
    #endif // CLASS_H__INCLUDED
    

    Class.cpp

    #include "my_dll.h"
    
    Class::Class() : m_hans("hans")
    {
    }
    
    std::string& Class::get_hans()
    {
        return m_hans;
    }
    

    main.cpp

    #include "stdafx.h"
    #include <iostream>
    #include "my_dll.h"
    
    #pragma comment(lib, "my_dll.lib")
    
    int main()
    {
    	std::cout << "Class-Klasse aus \"Class.h\"!" << std::endl;
    	Class instance;
    	std::cout << instance.get_hans() << std::endl;
    }
    

    ... So musst nun bei deinem my_dll Projekt einfach nur beim Compilieren angeben, das der MY_DLL definieren soll.



  • AUf Struktur hab ich beim Zusammenkopieren mal verzichtet gehabt, das war ja auch nicht das Problem...

    Zu deiner Lösung:

    Du includierst ja so in der Konsolenappli eine Header aus der DLL, das geht ja aber nur wenn sich beide im selben Projekt befinden, wenn ich in einem externen Projekt die lib mit angebe benötige ich ja eine Schnittstelle, in der die klassenheader vordefiniert werden, das sollte die dll.h darstellen.

    Andernfalls kennt er ja die my_dll.h garnicht, da sie mit in die DLL kompiliert wurde.



  • Ok Problem ist nun gelöst ... ich hatte da ein namespace drin, den ich bei den Headern der Schnittstelle nicht genauso deklariert hatte ... das verursachte dann den Linkererror...

    (Und nun sollte ich mich hier mal registrieren, dann kann ich wenigstens die Beiträge bearbeiten .... )



  • hmm du macht dem compiler den pfad zu deiner lib bekannt und includierst dann my_dll.h ...


Anmelden zum Antworten