LNK 2019 "Unresolved External Symbol"错误 (C++ OpenGL)
LNK 2019 "Unresolved External Symbol" Error (C++ OpenGL)
我对C++还比较陌生,在文件中创建类时遇到了一些问题。我试图从一个单独的类Shader中调用一个构造函数,并在该类中使用一个方法。然而,每当我试图构建解决方案时,我都会收到以下错误:
Error 2 error LNK2019: unresolved external symbol "public: void __thiscall Shader::Use(void)" (?Use@Shader@@QAEXXZ) referenced in function _main
Error 1 error LNK2019: unresolved external symbol "public: __thiscall Shader::Shader(char const *,char const *)" (??0Shader@@QAE@PBD0@Z) referenced in function _main
我知道Project Properties Linker或渲染系统没有什么问题,因为我以前用我当前的配置渲染过东西,所以我认为这一定与代码有关,但我无法弄清楚:
main.cpp
#include <iostream>
// GLEW
#define GLEW_STATIC
#include <GL/glew.h>
// GLFW
#include <GLFW/glfw3.h>
// Other includes
#include "Shader.h"
int main ()
{
(... Window Setup ...)
// Build and compile shader program
Shader shaders ("shader.vs", "shader.frag");
(... Set up vertex data (and buffer(s)) and attribute pointers ...)
// Game loop
while(!glfwWindowShouldClose (window))
{
glfwPollEvents ();
ourShader.Use ();
(... Draw triangle ...)
glfwSwapBuffers (window);
}
(... De-allocate all resources ...)
(... Terminate window ...)
return 0;
}
Shader.h
#ifndef SHADER_H
#define SHADER_H
#include <string>
#include <fstream>
#include <sstream>
#include <iostream>
#include <GL/glew.h>
class Shader
{
public:
GLuint Program;
Shader(const GLchar* vertexPath, const GLchar* fragmentPath);
void Use ();
};
#endif
Shader.cpp
#ifndef SHADER_H
#define SHADER_H
#include <string>
#include <fstream>
#include <sstream>
#include <iostream>
#include <GL/glew.h>
#include "Shader.h"
class Shader
{
public:
GLuint Program;
Shader::Shader(const GLchar* vertexPath, const GLchar* fragmentPath)
{
(... 1. Retrieve the vertex/fragment source code from filePath ...)
(... 2. Compile shaders ...)
(... 3. Link shader program ...)
(... 4. Delete shaders after usage ...)
}
void Shader::Use ()
{
(... Use current shader program ...)
}
};
#endif
如有任何帮助,我们将不胜感激。如果需要更多的代码,我可以提供。提前感谢!
首先,如果编译它,那是因为shader.cpp
中的包含保护删除了错误代码。其次,如果您从shader.cpp
中删除包含保护(您应该这样做),这将不会编译,因为该类在shader.cpp中声明了两次(通过#include "Shader.h"
)。链接错误反过来发生,因为main.cpp没有与shader.cpp的编译版本链接。
- 从
shader.cpp
中删除包含保护-由于您在shader.h
中定义了SHADER_H
,预处理器将在shader.cpp
到达编译器之前删除所有代码 -
从shader.cpp中删除类声明,但保留着色器类的所有成员的定义。只要保持
shader.cpp
简单,就像这样:#include "shader.h" Shader::Shader(const GLchar* vertexPath, const GLchar* fragmentPath) { /*..body */ } Shader::use() { /*..body */ }
-
确保将
main
与着色器的编译版本(例如g++ main.cpp shader.o
)链接,假设着色器是单独编译的,例如g++ -c shader.cpp
相关文章:
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 了解 GLM- openGL 中的相机转换
- 如何在全屏模式下(在OpenGL中)使背景透明
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- OpenGL大的3D纹理(>2GB)非常慢
- OpenGl glm rotate
- C++atioglxx.pdb未加载错误glBufferData OpenGL
- OpenGL在启用深度测试时不会丢弃我的碎片
- OpenGL相机和相机空间转型的困惑
- OpenGL将纹理四边形渲染为(0,0)
- OpenGL 和 GLM 矩阵无法正确扩展,总是按比例缩小
- 发布旋转矩阵(openGL/glm)
- 如何在Visual Basic中使用矩形函数OpenGL绘制矩形
- 无法使用VAO和EBO(openGL)绘制多个对象
- 为什么我的点没有在 OpenGL 中绘制鼠标所在的位置?
- OpenGL 16 位模板缓冲区?
- 将QOpenGLWidget子类转换为使用Metal而不是OpenGL的子类是否可行?
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- 在 openGL 中多次绑定缓冲区
- opengl glBegin(GL_LINES) 和 glBegin(GL_POINT) 在 2D 中不可视化点矢量