7

我在 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++ 项目\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;

我真的很感激,任何帮助或至少一些建议,在那里我可以了解更多关于这个问题的信息。

4

3 回答 3

5

您需要在全局范围内的 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 时 - 你正在导出类型。因此,您需要dll 文件中define的静态成员。.cpp您还需要确保已启用DIALOG_MAINMENU_EXPORTS编译器设置中的定义。这将确保导出类型。

现在,当您将控制台应用程序与 dll 链接时 - 您将使用#includedll 的标头并且不要在编译器设置中启用任何定义DIALOG_MAINMENU_EXPORTS(只需保留默认设置)。这将使编译器明白现在您正在将类型从 dll 导入控制台应用程序。

我希望它现在清楚了。

于 2013-07-27T20:27:57.917 回答
4

检查您是否使用 .dll 添加了对项目的引用(它解决了我的问题)右键单击项目 > 添加 > 引用 >(使用您的 .dll 的项目)

于 2019-04-21T08:08:04.377 回答
2

导出静态类成员有问题:

如果在类定义中将静态数据成员声明为 dllexport,则定义必须出现在同一程序中的某处(与非类外部链接一样)。

但我通常做的是使用访问方法。静态函数方法链接得很好。

//.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;
}
于 2013-07-27T20:44:24.197 回答