未解析的外部符号_declspec(dllimport)

Unresolved external symbol _declspec(dllimport)

本文关键字:declspec dllimport 符号 外部      更新时间:2023-10-16

我已经在Visual Studio中为控制台应用程序创建了一个DLL。在我的DLL中,我有一个名为Dialog_MainMenu的类,它有一个*.cpp文件和一个*.h文件。

以下错误消息

错误9错误LNK2001:未解析的外部符号"__declspec(dllimport)public:静态枚举Dialog_MainMenu::GAME_STATES Dialog_MainMenu::CurrentGameState"(_imp?CurrentGameState@Dialog_MainMenu@@2W4GAME_STATES@1@A) C:\Users\Kevin\Desktop\C++projects\development_testion\The IntensiveAdventure\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;

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

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

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

我希望现在一切都清楚了。

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

导出静态类成员时出现问题:

如果将类定义中的静态数据成员声明为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;
}