incompatible dll lien & définition de dllimport donnée membre statique non autorisés

En supposant que j'ai ces deux fichiers:

En-tête.h

class DLL ExportClass{
public:
  ExportClass();
  static int test;
};

Source.cpp

#ifdef EXPORT
    #define DLL __declspec(dllexport)
#else
    #define DLL __declspec(dllimport)
#endif

#include "Header.h"

int ExportClass::test = 0;
ExportClass::ExportClass(){
}

Et je ne vais pas définir EXPORT (pour importer un déjà exporté classe avec un static membre), pourquoi dois-je obtenir ces mises en garde:

1>source.cpp(11): warning C4273: 'test' : inconsistent dll linkage
1>          header.h(4) : see previous definition of 'public: static int ExportClass::test'
1>source.cpp(13): warning C4273: 'ExportClass::ExportClass' : inconsistent dll linkage
1>          header.h(3) : see previous definition of '{ctor}'

Et cette erreur:

1>source.cpp(11): error C2491: 'ExportClass::test' : definition of dllimport static data member not allowed

Si je définir EXPORT il fonctionne. Je sorte de comprendre les mises en garde, mais j'ai pensé, que la variable statique et le ctor pouvait être ignoré par le compilateur, car l'ensemble de la classe est déclarée comme __declspec(dllimport) de toute façon. Je veux utiliser la même base de code pour le __declspec(dllexport) et __declspec(dllimport) - mais il semble que le compilateur stll tente de définir ces symboles qui sont marqués comme __declspec(dllexport) dans leur déclaration. Qu'est-ce que la pratique courante pour résoudre ce problème?

OriginalL'auteur Constantin | 2013-11-12