C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)

C++: unresolved external symbol thrown in Application.cpp (solution is at the end of the question for future readers)

本文关键字:问题 解决方案 参考 未来 符号 cpp Application 外部 C++      更新时间:2023-10-16

所以我正在用C++(和GLFW,但这无关紧要(编写一个输入处理程序,并且有一个没有在头中实现的函数会导致此错误:

1>Input.obj : error LNK2001: unresolved external symbol "private: static class Input Input::instance" (?instance@Input@@0V1@A)

它在Application.cpp:中的名称如下

Input::GetInstance().Init(window);
Input::GetInstance().Update();

实现是这样的:

输入.h:

#ifndef INPUT_H_INCULDED
#define INPUT_H_INCLUDED
//Some includes
class Input
{
public:
static Input& GetInstance();
//some other non-static stuff
};
#endif

以及在Input.cpp中的实现:

Input& Input::GetInstance()
{
return instance;
}

instance是Input的静态成员。

我有glew和glfw-libs,并包含在解决方案目录中一个名为Dependencies的文件夹中。我将它包含在项目属性的C/C++\General\Additional Include Directories下,还添加了$(SolutionDir(src,因为我已经将每个源文件都放在了src下。

然后,我将它们链接起来,在Linker\General\Additional Library Directories下,我添加了lib文件的位置,在Linkr\Input下,我将glfw3.lib、opengl32.lib和glew3s.lib添加到Additional Dependencies,最后,添加了GLEW_STATIC预处理器定义。这些是我在项目属性中所做的唯一更改,我使用Debug、x86配置。链接到源代码:

https://github.com/Andrispowq/Prehistoric-Engine---C-

编辑:对于任何未来的读者:我的问题是我必须写

Input Input::instance;

在代码的某个地方,在cpp文件中,因为实例是Input类的静态成员。所以,如果你有类似的问题,一定要检查你是否有静态变量,以及你是否已经像这样初始化了它们!

您的实例成员显然也需要是静态成员,原因有很多,例如为了实现singleton模式,尤其是因为您通过引用返回。顺便说一句,如果静态成员函数访问类的一些成员,那么该成员也需要是静态的。例外情况是,例如,如果您的静态方法采用的参数可以是类的特定实例,也可以强制转换为它,并且进一步使用它的参数,静态成员函数可以通过该已知实例访问或使用方法或数据成员,并将其作为参数传递给静态成员,但GetInstance不采用任何参数。我希望这能帮助你理解编译器告诉你的是什么,该编译器找不到符号实例