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

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

所以我正在用 C++(和 GLFW,但这并不重要)编写一个输入处理程序,并且 header 中未实现的一个函数删除此错误:

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();

实现是这样的:

Input.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 库和包含在解决方案目录中名为 Dependencies 的文件夹中。我将它包含在项目属性中,在 C/C++\General\Additional 包含目录下,我还添加了 $(SolutionDir)src,因为我已将每个源文件都放在 src.

然后我 link 编辑了它们,在链接器 \General\Additional 库目录下,我添加了 lib 文件的位置,在 Linker\Input 下,我添加了 glfw3.lib、opengl32.lib 和 glew3s.lib 到附加依赖项,最后,添加了 GLEW_STATIC 预处理器定义。这些是我在项目属性中所做的唯一更改,我使用调试、x86 配置。 link转源码:

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

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

Input Input::instance;

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

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