Klassen in DLL exportieren mit static Variablen



  • Hallo,

    ich bin über ein Problem beim Exportieren von Klassen mit static Variablen gestolpert und weiß nicht wie ich es lösen soll... ich hab mal schnell ein einfach Programm mit dem selben Problem gebaut.

    Ich habe eine DLL die sieht wie folgt aus:

    TestClass.h

    #pragma once
    
    class __declspec(dllexport) CTestClass
    {
    private:
    	static int	i;
    public:
    	CTestClass(void);
    	~CTestClass(void);
    
    	void Init();
    
    	static int GetI() { return i; }
    };
    

    TestClass.cpp

    #include "TestClass.h"
    
    int	CTestClass::i = 0;
    
    CTestClass::CTestClass(void)
    {
    }
    
    CTestClass::~CTestClass(void)
    {
    }
    
    void CTestClass::Init()
    {
    	i = 20;
    }
    

    dllmain.cpp

    #include <windows.h>
    
    #include "TestClass.h"
    
    BOOL APIENTRY DllMain( HMODULE hModule,
    					  DWORD  ul_reason_for_call,
    					  LPVOID lpReserved
    					  )
    {
    	switch (ul_reason_for_call)
    	{
    	case DLL_PROCESS_ATTACH:
    	case DLL_THREAD_ATTACH:
    	case DLL_THREAD_DETACH:
    	case DLL_PROCESS_DETACH:
    		break;
    	}
    	return TRUE;
    }
    

    Das Programm hierzu sieht wie folgt aus (link gegen die dll):

    main.cpp

    #include <iostream>
    #include "..\DLL\TestClass.h"
    
    int	CTestClass::i = 0;
    
    int main()
    {
    	CTestClass testClass;
    	testClass.Init();
    
    	std::cout << CTestClass::GetI();
    
    	return 0;
    }
    

    Wenn ich die Zeile int CTestClass::i = 0; weglasse dann compeliert er natürlich nicht.
    Aber wenn ich sie drin lasse dann ist i == 0.
    Wie kann ich das umgehen?

    Danke schon mal!



  • also ich würd sagen, dass du nur in der DLL-cpp "int CTestClass::i = 0;"
    schreiben musst..

    außerdem .. wird bei dir bei der Klasse aich mal "__declspec(dllimport)" benutzt ????
    vieleicht liegt es daran ...



  • wenn ich das int CTestClass::i = 0; in der main.cpp weglasse dann bekomm ich einen Linkfehler:

    1>main.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""private: static int CTestClass::i" (?i@CTestClass@@0HA)".

    Nur zur Info: die TestClass.cpp hab ich nicht im Test Programm included, sondern nur die Header Datei.

    Hab mal das __declspec(dllexport) herausgenommen kommt aber trotzdem der Linkfehler von oben. Außerdem brauch ich ja das __declspec(dllexport) um die Klasse zu exportieren, oder nicht 😕



  • Du musst dir einfach ein makro machen:

    #ifdef DLL_EXPORTS 
    #define DLL_API __declspec(dllexport) 
    #else 
    #define DLL_API __declspec(dllimport) 
    #endif
    

    Dann musst du in den Projekt-Eigenschaften der DLL nur noch "DLL_EXPORTS"
    definieren ...
    Wennn du jetzt die DLL kompilierst, wird "__declspec(dllexport)" benutzt
    und wenn du dein hauptprogramm kompilierst wird "__declspec(dllimport)"
    benutzt und dann müsste es funktionieren


Anmelden zum Antworten