【问题标题】:Unresolved external symbol _declspec(dllimport)未解析的外部符号 _declspec(dllimport)
【发布时间】:2013-07-27 20:04:31
【问题描述】:

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

以下错误消息

错误 9 错误 LNK2001:无法解析的外部符号 "__declspec(dllimport) 公共:静态枚举 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;

如果有任何帮助或至少一些建议,我将不胜感激,我可以在其中了解有关此问题的更多信息。

【问题讨论】:

  • 你引用了.lib文件吗?
  • 我确实做到了。我什至检查了三次。
  • 您可以添加用于您的问题的链接命令吗?
  • 您的意思是附加包含目录吗?我不太明白你的意思。我对 C++ 有点陌生。
  • 不,我的意思是 IDE 调用以在您的问题中产生该链接错误的完整链接器命令。它应该在构建日志中的某个位置。

标签: c++ dll enums console-application dllimport


【解决方案1】:

您需要在全局范围内的 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 导入到控制台应用程序中。

我希望它现在清楚了。

【讨论】:

  • 那在哪里?似乎找不到这个地方,我把你最开始输入的下面一行放在了哪里。
  • 就像你在.h 文件中的declare 方法和define 它们在.cpp 中一样 - 你还需要define static 成员。你可以把那行代码放在Dialog_MainMenu::GAME_STATES Dialog_MainMenu::GetState() {的正上方
  • 那只是给我一个错误:不允许定义 dllimport 静态数据成员
  • 您要导入还是导出类型?
【解决方案2】:

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

【讨论】:

  • 即使 6 年后人们仍然发现这个问题可能会对某人有所帮助!
  • 今天仍然有帮助
  • 是的仍然有帮助
【解决方案3】:

导出静态类成员有问题:

If you declare a static data member within a class definition as dllexport, a definition must occur somewhere within the same program (as with nonclass external linkage).

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 2015-06-27
    • 2021-12-04
    相关资源
    最近更新 更多