Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 未解析的外部符号_declspec(dllimport)_C++_Dll_Enums_Console Application_Dllimport - Fatal编程技术网

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

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

我已经在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 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年后人们仍然会发现这个问题,可能对某些人有帮助!今天仍然有帮助吗