Static variablen in DLLs
-
hey, ich hab ein dll projekt in visual studio erstellt indem ich ein neues "Class Library" projekt gemacht habe und anschließend /clr deaktiviert und auf "no common language runtime support" gestellt habe
in der DLL haben diverse klassen static member welche in den cpp files der dll initialisiert werden wie zb singleton instanzen und konstanten
wenn ich in einem zweiten projekt als "Empty Project" erstellt auf die DLL zugreifen will und eine der *.h files der klassen inkludiere welche statische member haben bekomme ich linker errors der form
error LNK2001: unresolved external symbol "private: static float const PinkballsOpenGL::Math::Geometry::PI_BY_180"wenn die static member der klassen also nach außen hin sichtbar sind für das projekt welches die dll benutzt oder auch schon in einer methode verwendet werden die nach außen hin sichtbar ist wird für sie ein linker error generiert
meine frage ist jetzt wie man das anstellen soll dass man in der DLL statische variablen die member von C++ klassen sind initialisieren kann und sie in dem programm welches die DLL benutzt verwenden kann
-
Vevusio schrieb:
... statische variablen die member von C++ klassen sind initialisieren kann ...
*.h
-----------class A { static int a; };*.cpp
----------static int A::a = 0;Hast du auch die *.lib Datei dem Linker bekannt gemacht?
-
die dll h file aus dem dll projekt
// TestDLL.h #pragma once namespace TestDLL { class __declspec(dllexport) Class1 { public: static const float FLOATCONSTANT; }; }die cpp file dazu
// TestDLL.cpp #include "stdafx.h" #include "TestDLL.h" const float TestDLL::Class1::FLOATCONSTANT = 23.32f;und die main aus einem zweiten projekt welche diese dll verwendet
//Main.cpp #include "TestDLL.h" #include <iostream> #pragma comment(lib, "TestDLL.lib") using TestDLL::Class1; using std::cout; int main(int argc, char **argv) { cout << Class1::FLOATCONSTANT; return 0; }liefert den linker error
error LNK2001: unresolved external symbol "public: static float const TestDLL::Class1::FLOATCONSTANT" (?FLOATCONSTANT@Class1@TestDLL@@2MB) Main.obj
-
Versuch ohne das const.
einfach
... static float FLOATCONSTANT; ...[cpp]
-
also weiss irgend jemand ob das überhaupt möglich ist bzw wenn ja ob es eh so gehen sollte und an meinen compiler einstellungen liegt in dem fall?
-
Was mir jetzt auffählt, du verwendest die gleiche
class declaration in "dll projekt" und "exe projekt".
In "exe projekt" muss sieclass __declspec(dllimport) Class1 ...
heissen.
-
omg -.-
das ist jetzt schon fast peinlich *g*
es lag wirklich daran, vielen dank