Re: exporting static class data members
On Wed, 27 Feb 2008 17:44:13 +0100, "Mario Semo" <mario_semo@Xhotmail.com>
wrote:
Hello,
Visual Studio 2008 Express
i use __declspec to export classes which worked fine for function mebers,
and "normal" data members.
but it fails for static data members. they were simple unresolved in the
clients.
here is a sample:
what to do?
thx a lot for any help.
mario.
===== dll.hpp ======
#ifdef __DLL__
#define _Export __declspec(dllexport)
#else
#define _Export
#endif
class _Export foo
{
public:
static int data;
static void bar();
};
===== dll.cpp ======
#include "dll.hpp"
int foo::data=123;
void foo::bar()
{
}
=== main.cpp ======
#include <stdio.h>
#include "dll.hpp"
int main(int argc,char *argv[])
{
printf("%d\n",foo::data);
foo::bar();
return 0;
}
===== gen2.bat =====
cl /LD /D__DLL__ dll.cpp
cl main.cpp dll.lib
->
main.obj : error LNK2019: unresolved external symbol "public: static int
foo::data" (?data@foo@@2HA) referenced in function _main
You need to use __declspec(dllimport) on the client side for that to work.
It also allows more efficient function calls. Besides this, there are two
other problems with your technique: (1) You're using __DLL__ to control the
_Export macro, which means another DLL can't use your DLL because the macro
will incorrectly expand to dllexport when the 2nd DLL #includes dll.hpp,
and (2) _Export begins with an underscore and uppercase letter, which means
it's a reserved name.
This is what you should do. Replace your use of _EXPORT with X_EXPORT,
replacing "X" with the name of your DLL, making sure it has a reasonable
chance of being unique:
#ifdef COMPILING_X_DLL
#define X_EXPORT __declspec(dllexport)
#else
#define X_EXPORT __declspec(dllimport)
#endif
Then #define COMPILING_X_DLL only in that DLL's project. This method can be
used by multiple DLLs, and since the macro names are unique, they don't
conflict.
--
Doug Harrison
Visual C++ MVP