C++ 未解析的外部符号_declspec(dllimport)
我已经在VisualStudio中为我的控制台应用程序创建了一个DLL。 在我的DLL中,我有一个名为Dialog_MainMenu的类,它有一个*.cpp文件和一个*.h文件 以下错误消息:C++ 未解析的外部符号_declspec(dllimport),c++,dll,enums,console-application,dllimport,C++,Dll,Enums,Console Application,Dllimport,我已经在VisualStudio中为我的控制台应用程序创建了一个DLL。 在我的DLL中,我有一个名为Dialog_MainMenu的类,它有一个*.cpp文件和一个*.h文件 以下错误消息: #ifdef DIALOG_MAINMENU_EXPORTS #define DIALOG_MAINMENU_API __declspec(dllexport) #else #define DIALOG_MAINMENU_API __declspec(dllimport) #endif class
#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();
};
//Get state
Dialog_MainMenu::GAME_STATES Dialog_MainMenu::GetState() {
// Code..
}
//Switching state
Dialog_MainMenu::CurrentGameState = Dialog_MainMenu::GAME_STATES::GAME;
错误9错误LNK2001:未解析的外部符号
“uu declspec(dllimport)public:静态枚举
对话框\主菜单::游戏\状态对话框\主菜单::当前游戏状态“
()小鬼?CurrentGameState@Dialog_MainMenu@@2W4GAME_STATES@1@A) C:\Users\Kevin\Desktop\C++
项目\开发\测试\密集型
Adventure\Dialogs\Dialog\u 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();
};
//Get state
Dialog_MainMenu::GAME_STATES Dialog_MainMenu::GetState() {
// Code..
}
//Switching state
Dialog_MainMenu::CurrentGameState = Dialog_MainMenu::GAME_STATES::GAME;
(不知道问题是否在这里,所以我只想补充一下)
cpp文件一般情况下:
#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();
};
//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;
编辑:
#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();
};
//Get state
Dialog_MainMenu::GAME_STATES Dialog_MainMenu::GetState() {
// Code..
}
//Switching state
Dialog_MainMenu::CurrentGameState = Dialog_MainMenu::GAME_STATES::GAME;
我已经在VisualStudio中为我的控制台应用程序创建了一个DLL。在我的DLL中,我有一个名为Dialog_MainMenu的类,它有一个*.cpp文件和一个*.h文件
好-编译dll时-导出类型。因此,您需要在dll的.cpp
文件中定义静态成员。您还需要确保已在编译器设置中启用了导出的定义。这将确保导出类型
现在,当您将控制台应用程序与dll链接时,您将#包括dll的标题,并且在编译器设置中不启用对话框\u主菜单\u导出的任何定义(只需保留默认设置)。这将使编译器明白,现在您正在将类型从dll导入控制台应用程序
我希望现在天气晴朗 导出静态类成员时出现问题:
但我通常使用的是访问方法。静态函数方法链接良好
//.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;
}
检查是否使用.dll添加了对项目的引用
(解决了我的问题)
右键单击project>Add>Reference>(带有.dll的project)是否引用了.lib文件?我当然引用了。我甚至检查了三遍。你能给你的问题添加链接命令吗?你是说添加的命令包括方向吗?我不太明白你的意思。我对C++有点新的认识。不,我是指IDE调用的完整链接器命令来在你的问题中产生链接错误。它应该在构建日志中的某个地方。它在哪里?似乎找不到地方了,我首先把您键入的以下行放在那里。就像您在.h
文件中声明方法,并在.cpp
中定义方法一样,您还需要定义静态成员。您可以将这行代码放在Dialog\u main menu::GAME\u STATES Dialog\u main menu::GetState()的正上方{
这只会给我一个错误:dllimport静态数据成员的定义不允许您尝试导入或导出类型吗?即使6年后人们仍然会发现这个问题,可能对某些人有帮助!今天仍然有帮助吗