LNK 2019"未解决的外部符号"错误(C ++ OpenGL)

时间:2015-12-11 08:26:47

标签: c++ opengl linker-errors glfw

我对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

我知道项目属性链接器或渲染系统没有任何问题,因为我之前使用当前配置渲染了一些东西,所以我认为它必须与代码有关但我可以&#39弄明白:

的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

非常感谢任何帮助。如果需要更多代码我可以提供。提前谢谢!

1 个答案:

答案 0 :(得分:1)

首先,如果这会编译它,因为shader.cpp中的包含守卫会删除错误的代码。其次,如果从shader.cpp(你应该)删除包含守护,这将无法编译,因为该类在shader.cpp中声明了两次(通过#include "Shader.h")。反过来发生链接错误是因为main.cpp没有与shader.cpp的编译版本链接。

  1. shader.cpp移除包含保护 - 由于您在SHADER_H中定义了shader.h,预处理器将在shader.cpp之前删除编译器中的所有代码
  2. 从shader.cpp中删除类声明,但保留着色器类的所有成员的定义。只需保持shader.cpp简单,就像这样:

    #include "shader.h"
    
    Shader::Shader(const GLchar* vertexPath, const GLchar* fragmentPath)
    { /*..body */ }
    
    Shader::use()
    { /*..body */ }
    
  3. 确保您将main与已修改的着色器版本相关联,例如g++ main.cpp shader.o,假设着色器是单独编译的,例如g++ -c shader.cpp