=?UTF-8?Q?Re=3A_Static_members_of_a_class_in_a_dll=E2=80=8F?=
On Sep 23, 10:50 am, Josemi <josemiant...@gmail.com> wrote:
I have a curious case with a class that has a static member
defined in a DLL. Let me explain:
dll.h
class __declspec (dllexport) A
{
public:static int valor;
PrintOut ()
{
TRACE1(valor);
}
}
dll.cpp
A::valor=23;
main.h
class B:A
{
}
main.cpp
A::valor;
{
A objeto;
objeto.valor = 34;
objeto.PrintOut();
}
Well, it happens that the value given in "main.cpp"
objeto.valor = 34, PrintOut print 23. Can you know what is
wrong? although I have some idea, I think the problem is that
I have to declare A::valor in the two routines and well, the
compiler creates two instances of A::valor, Is it posible
declare only one in dll.cpp file? or any idea how to solve
this problem. I can think of set routines that fill this gap,
but I wanted something less complicated.
Well, this is very off-topic. (C++ doesn't have a __declspec
command---that's pure VC++.) But since I've had the same
problem...
The declaration __declspec(dllexport) should only be used in the
dll in which the class will be defined. In the other dll's, it
should be __declspec(dllimport). For some strange reason,
__declspec(dllexport) works for importing as well, *except* for
static variables (and maybe some other rare cases). The usual
solution here is to prefix the dll.h header with something like:
#ifndef DLLNAME_EXPORT
#define DLLNAME_EXPORT __declspec(dllimport)
#endif
and then compile the sources for the dll itself with
/DDLLNAME_EXPORT=__declspec(dllexport)
(And yes, it's an ugly hack, but that's what Microsoft requires.
--
James Kanze