我在Visual Studio中为我的控制台应用程序创建了一个DLL。 在我的DLL中,我有一个名为Dialog_MainMenu的类,它有一个* .cpp文件和一个* .h文件。
以下错误消息:
错误9错误LNK2001:未解析的外部符号 “__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 ++ projects \ development_testing \ The Intense Adventure \ Dialogs \ Dialog_MainMenu.obj对话框
我有点不明白。这只发生在我在头文件中向我的原型添加枚举时。
标头文件:
#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();
};
(不知道问题是否在这里,所以我只是添加它) 一般 cpp文件:
//Get state
Dialog_MainMenu::GAME_STATES Dialog_MainMenu::GetState() {
// Code..
}
//Switching state
Dialog_MainMenu::CurrentGameState = Dialog_MainMenu::GAME_STATES::GAME;
我真的很感激,任何帮助或至少一些建议,我可以在这里了解更多关于这个问题。
答案 0 :(得分:4)
您需要在全局范围内的cpp文件中定义静态成员。
Dialog_MainMenu::GAME_STATES Dialog_MainMenu::CurrentGameState;
或者,您也可以为其指定一些初始值。
Dialog_MainMenu::GAME_STATES Dialog_MainMenu::CurrentGameState = Dialog_MainMenu::GAME_STATES::GAME;
修改强>:
我在Visual Studio中为我的控制台应用程序创建了一个DLL。在我的DLL中,我有一个名为Dialog_MainMenu的类,它有一个* .cpp文件和一个* .h文件。
好的 - 当您编译dll时 - 您正在导出类型。因此,您需要define
dll的.cpp
文件中的静态成员。您还需要确保在编译器设置中启用了DIALOG_MAINMENU_EXPORTS
的定义。这将确保导出类型。
现在,当您将控制台应用程序与dll链接时 - 您将#include
dll的标头,并且不会在编译器设置中启用DIALOG_MAINMENU_EXPORTS
的任何定义(只保留设置默认值)。这将使编译器理解现在您正在将类型从dll导入控制台应用程序。
我希望现在明白。
答案 1 :(得分:1)
导出静态类成员时出现问题:
但我通常做的是使用访问方法。静态函数方法链接正常。
//.h file
class Dialog_MainMenu {
public:
static DIALOG_MAINMENU_API enum GAME_STATES {
MAINMENU, GAME, OPTIONS, CREDITS, QUIT
};
static GAME_STATES CurrentGameState;
DIALOG_MAINMENU_API GAME_STATES GetState();
static DIALOG_MAINMENU_API GAME_STATES& GetCurrentState();
};
//.cpp file
GAME_STATES& Dialog_MainMenu ::GetCurrentState()
{
return CurrentGameState;
}
答案 2 :(得分:0)
检查是否使用.dll添加了对项目的引用 (解决了我的问题) 右键单击项目>添加>参考>(带有.dll的项目)