C++ – Exporting global variables from DLL

c++dlldllimportvisual-studio

I'm trying to export a global variable from a DLL.

Foo.h

class Foo
{
public:
    Foo()
    {}
};

#ifdef PROJECT_EXPORTS
    #define API __declspec(dllexport)
#else
    #define API __declspec(dllimport)
#endif

API const Foo foo;

Foo.cpp

#include "Foo.h"

const Foo foo;

When I compile the above code, Visual Studio complains:

foo.cpp(3) : error C2370: 'foo' : redefinition; different storage class
1> foo.h(14) : see declaration of 'foo'

If I use:

external const Foo foo;

in Foo.h the compiler is happy but then the DLL does not export the symbol. I've managed to export functions with problems, but variables don't seem to work the same way… Any ideas?

Best Solution

In your header:

API extern const Foo foo;

In your source file:

API const Foo foo;

If you don't have the extern keyword, your C compiler assumes you mean to declare a local variable. (It doesn't care that you happened to have included the definition from a header file.) You also need to tell the compiler that you're planning on exporting the variable when you actually declare it in your source file.

Related Question