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
Vous devez vous connecter pour publier un commentaire.
Vous attendent au compilateur d'ignorer un très grave accident. Il a rencontré l' __declspec(dllimport) attribut sur la déclaration de la classe, tout à fait sans équivoque des états que l'implémentation de la classe est présente dans les différentes module qui va lié à l'exécution. Mais ensuite, il a rencontré la définition ainsi, complètement inattendu, car l'attribut contrat dit qu'il est compilé dans un tout autre projet.
La C4273 avertissement est généré pour vous rappeler qu'il est très difficile de ce la fonction qui se passe réellement à exécuter au moment de l'exécution. Il y a deux, l'un qui est occupé de la compilation, un autre dans la DLL. Quel sera fait exécuter sauvage est un deviner. C4273 est un niveau 1 d'alerte, le genre qui fit de la "ce est presque sûrement tort" de la catégorie. Il n'est pas tout à fait impossible de travailler bien car il n'y a certains attente que les fonctions ont au moins le même code. La cote qui ne sera pas causer des problèmes ne sont cependant pas grand, il ne peut fonctionner que si la fonction n'ont pas d'effets secondaires susceptibles de modifier les DLL de l'état. Très difficile à diagnostiquer bug quand il ne btw.
Puis il a rencontré le exporté variable. Même cas, il y en a deux. C'est là que le compilateur programmeur de mettre son pied à terre, ayant le code de hasard, utilisez l'un ou l'autre n'est plus quelque chose qui peut être ignorée. Qui ne peuvent pas toujours travailler, les variables ne peuvent avoir la même valeur. Donc C2491 est une erreur de disque dur.
Aucune idée de comment vous avez en ce cornichon, clairement de la route, vous essayez de voyage va vous faire tomber d'une falaise abrupte.
OriginalL'auteur Hans Passant
Je n'arrive pas à reproduire votre problème est de faire ce qui suit:
EXPORT
de l'définitions de préprocesseurSi, au lieu des étapes 4 et 5, je ne les suivants, je ne vois pas une erreur:
Créer une application console Win32, appeler Project2
Ajouter le code source comme suit:
Je soupçonne que vous voyez ces erreurs parce que vous faites tout de la même DLL projet et il est l'écrasement de la LIB qu'il a précédemment créé, puis tentez d'importer.
Si je suis bon à deviner ce que vous avez fait, vous pouvez essayer d'utiliser votre fichier DLL/LIB à partir d'un autre projet et de voir ce qui se passe?
OriginalL'auteur Roger Rowland