Statische Elemente in dllexport

Cromon

Erfahrenes Mitglied
Hallo zusammen!

Kurz und bündig gesagt: Ich stehe gerade auf dem Schlauch! Ich arbeite gerade an einem etwas grösseren Projekt, bei dem ich auch gerade ein DLL-Interface aufbaue, eigentlich nichts Neues oder Ungewohntes. Allerdings stehe ich gerade vor einigen Fehlern, die mir nicht wirklich klar werden wollen!

Ich habe eine Klasse, die das Singleton-Prinzip realisieren soll:
Code:
#ifndef _SINGLE_H
#define _SINGLE_H

#define initSing( type ) \
	template <> type * Single<type>::inst = 0

template<typename T>
class __declspec(dllexport) Single
{
public:
	static T* inst;
	static T* getSingle()
	{
		if(!inst)
			throw("inst == 0 - tritt auf, wenn der Konstruktor noch nicht aufgerufen wurde!");
		return inst;
	}

	Single()
	{
		if(inst)
			throw("inst != 0  - Konstruktor einer Single-Klasse nur einmal aufrufen!!");
		inst = (T*)this;
	}
};

#endif

Nun habe ich zum Beispiel die Klasse CLog, welche von Single erbt und auch als __declspec(dllexport) deklariert ist. In der Datei CLog.cpp ist auch entsprechend der Singleton mit initSing(CLog) initialisiert worden.

Wenn ich nun testhalber eine DLL erstelle, die die Common.h (da stehen alle includes des Projekts drin) includiert und die erstellte Library als Abhängigkeit verwendet, so erhalte ich folgenden Fehler:
Nicht aufgelöstes externes Symbol ""public: static class CLog * Single<class CLog>::inst" (?inst@?$Single@VCLog@@@@2PAVCLog@@A)"

Ich komm irgendwie nicht mehr dahinter, was genau das Problem ist. Wäre nett, wenn mir jemand behilflich sein könnte :)

Gruss und Dank
Cromon
 
Wenn der Fehler in der Zeile 5 auftritt: In der Zeile ist inst noch nicht bekannt, da es ja erst weiter unten definiert wird.
 
Der Fehler tritt nur auf, wenn ich eine DLL erstelle und da dann die Common.h includiere aus dem eigentlichen Projekt. Wenn ich die vom Projekt erstellte lib dazulinke, bekomme ich den Fehler mit dem Singleton und wenn ich sie ganz weglasse, kommen natürlich Linkerfehler en masse.

Zeile 5 ist nur ein Präprozessormakro, das wird ja nie compiliert, sondern einfach direkt eingesetzt an der Stelle, an der man es braucht.
 
In keiner Datei an sich. Er tritt beim linken auf. Wenn in in einer DLL die Common.h des Hauptprojekts includiere und die erstellte Library des Hauptprojekts miteinbinde, dann tritt er in der Objektdatei jeder .cpp Datei auf, die ich in der DLL verwende.

/edit:
Habs gerade herausgefunden, hab vergessen DLL und Projekt zu unterscheiden. http://pastebin.com/m4e746eb9 hat es natürlich gelöst.
 
Zuletzt bearbeitet:
Zurück