未解决的外部符号 _declspec(dllimport)。

8
我已经在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 Dialogs
我有点不理解这个错误。当我在头文件中添加一个枚举时才会出现这种情况。
头文件:
#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;

我真的很感激任何帮助或至少一些建议,让我能够更多地了解这个问题。


你有引用这个 .lib 文件吗? - Yochai Timmer
1
我肯定做了。我甚至三次检查过了。 - Kevin Jensen Petersen
你是指“附加包含目录”吗?我不太明白你的意思。我对C++还比较新。 - Kevin Jensen Petersen
不,我的意思是IDE调用的完整链接器命令,以产生你问题中的链接错误。它应该在构建日志中的某个地方。 - greatwolf
请注意,在 enum GAME_STATES 中不需要使用 staticDIALOG_MAINMENU_API - greatwolf
显示剩余4条评论
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的.cpp文件中define静态成员。你还需要确保在编译器设置中启用了DIALOG_MAINMENU_EXPORTS的定义。这将确保类型被导出。

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

希望现在清楚了。


那在哪里?似乎找不到我最初放置你输入的那行代码的地方。 - Kevin Jensen Petersen
就像你在 .h 文件中 声明 方法并在 .cpp定义 它们一样,你也需要 定义 static 成员。你可以将那行代码放在 Dialog_MainMenu::GAME_STATES Dialog_MainMenu::GetState() { 的上方。 - YK1
那只是给了我一个错误:不允许定义dllimport静态数据成员。 - Kevin Jensen Petersen
你是在尝试导入还是导出类型? - YK1

5

检查是否在项目中添加了.dll的引用(这解决了我的问题)

右键单击项目 > 添加 > 引用 > (带有你的.dll的项目)


3
即使过了6年,人们仍然会找到这些问题。这可能对某些人有帮助! - osynavets
1
依然在今天有帮助。 - jplc
仍然有用 - Cezar Azevedo de Faveri

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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接