Symbole externe non résolu _declspec(dllimport)
J'ai créé une DLL pour mon Application Console dans Visual Studio.
Dans ma DLL, j'ai une Classe nommée Dialog_MainMenu avec un *.le rpc et le fichier *.h fichier.
Message d'erreur suivant:
Erreur 9 erreur LNK2001: symbole externe
"__declspec(dllimport) public: static enum
Dialog_MainMenu::GAME_STATES Dialog_MainMenu::CurrentGameState"
(_imp?CurrentGameState@Dialog_MainMenu@@2W4GAME_STATES@1@A) C:\Users\Kevin\Desktop\c++
les projets\development_testing\Intense
Aventure\Dialogs\Dialog_MainMenu.obj Dialogues
Qui j'ai un peu de ne pas comprendre. Cela ne s'est produite quand j'ai ajouté un enum pour mon prototype dans mon fichier d'en-tête.
Fichier d'en-tête:
#ifdef DIALOG_MAINMENU_EXPORTS
#define DIALOG_MAINMENU_API __declspec(dllexport)
#else
#define DIALOG_MAINMENU_API __declspec(dllimport)
#endif
class Dialog_MainMenu {
public:
static DIALOG_MAINMENU_API enum GAME_STATES {
MAINMENU, GAME, OPTIONS, CREDITS, QUIT
};
static DIALOG_MAINMENU_API GAME_STATES CurrentGameState;
DIALOG_MAINMENU_API GAME_STATES GetState();
};
(Je ne sais pas si le problème est là, donc je vais juste ajouter)
fichier cpp en général:
//Get state
Dialog_MainMenu::GAME_STATES Dialog_MainMenu::GetState() {
//Code..
}
//Switching state
Dialog_MainMenu::CurrentGameState = Dialog_MainMenu::GAME_STATES::GAME;
Je voudrais vraiment l'apprécier, de l'aide ou atleast quelques conseils, où je peux apprendre plus au sujet de ce problème.
- avez-vous de la référence de l' .fichier lib ?
- Je vous fait. J'ai même triple vérifié.
- Pouvez-vous ajouter le lien de commande utilisé à votre question?
- Entendez-vous le Plus d'Inclure Directiories? Je ne comprends pas très bien ce que tu veux dire. Im un peu novice en C++.
- Non, je veux dire la pleine commande liens que l'IDE invoquée pour produire l'erreur de couplage dans votre question. Il doit être quelque part dans le buildlog.
- Remarque, vous n'avez pas besoin
static
etDIALOG_MAINMENU_API
dansenum GAME_STATES
. - N'arrive pas à trouver ce journal.. :/ - Aussi, j'ai essayé de retirer la statique et DIALOG_... Même message d'erreur.
- Essayez de regarder dans votre dossier de projet de localisation. Vérifier ses sous-répertoires comme debug, release, etc.
- J'ai un couple de fichiers nommés des choses comme lien.commande, lien.lire, etc.. Qui ne contient rien en elle.
Vous devez vous connecter pour publier un commentaire.
Vous devez définir le membre statique dans votre fichier cpp dans la portée globale.
Alternativement, vous pouvez également attribuer quelque valeur initiale.
MODIFIER:
OK - lors de la compilation de la dll - vous de l'exportation de la types. Donc, vous avez besoin de
define
le membre statique dans.cpp
fichier de la dll. Vous devez également vous assurer que vous avez activé la définition deDIALOG_MAINMENU_EXPORTS
dans les paramètres du compilateur. Ce sera assurez-vous que les types sont exportés.Maintenant, lorsque vous vous connectez à l'application de console avec dll - vous
#include
dll en-tête et de ne pas permettre à toute définition deDIALOG_MAINMENU_EXPORTS
dans les paramètres du compilateur (il suffit de laisser les paramètres par défaut). Cela rendra le compilateur comprendre que vous êtes maintenant importer les types de votre dll dans l'application de la console.J'espère que son clair maintenant.
declare
méthodes de.h
fichier etdefine
dans.cpp
- vous devez égalementdefine
lastatic
membres. Vous pouvez mettre la ligne de code juste au-dessus deDialog_MainMenu::GAME_STATES Dialog_MainMenu::GetState() {
Il y a un problème avec l'exportation de classe statique membres:
Si vous déclarez une donnée membre statique dans une définition de classe comme dllexport, une définition doit se produire quelque part à l'intérieur d'un même programme (comme avec nonclass liaison externe).
Mais ce que j'ai l'habitude de faire est d'utiliser la méthode d'accès. Fonction statique méthodes sont liées amende.
De vérifier si vous avez la référence a été ajoutée à votre projet .dll
(C'est résolu mon problème)
Clic droit sur le projet > Ajouter > Reference > (projet avec votre .dll)