Exportando variables globales desde DLL

Estoy tratando de exportar una variable global desde una 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; 

Cuando compilo el código anterior, Visual Studio se queja:

foo.cpp (3): error C2370: ‘foo’: redefinición; almacenamiento diferente clase 1> foo.h (14): vea la statement de ‘foo’

Si uso:

 external const Foo foo; 

en Foo.h el comstackdor está contento pero la DLL no exporta el símbolo. He logrado exportar funciones con problemas, pero las variables no parecen funcionar de la misma manera … ¿Alguna idea?

En su encabezado:

 API extern const Foo foo; 

En su archivo fuente:

 API const Foo foo; 

Si no tiene la palabra clave extern , su comstackdor de C asume que quiere declarar una variable local. (No importa que haya incluido la definición de un archivo de encabezado). También debe decirle al comstackdor que planea exportar la variable cuando la declare en su archivo fuente.

Lo más probable es que la clase Foo tenga funciones miembro en realidad, llamar a las de otro módulo causaría errores de vinculador con la respuesta OP / aceptada. La clase debe definirse como dll export / import también para usar la instancia exportada fuera de este módulo para eliminar los errores de enlace.

 class API Foo { public: Foo() {} void DoSomeWork(); // calling this would cause link error if Foo is not defined as import/export class }; 

Dicho esto, podría ser mejor cambiar el nombre de #define API con algo como DLLEXPORT para que tenga sentido tanto para las API como para la clase de exportación.