LNK 2019 Ошибка "Неразрешенный внешний символ" (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

Я знаю, что в компоновщике свойств проекта или в системе рендеринга нет ничего плохого, потому что раньше я рендерил вещи с моей текущей конфигурацией, поэтому я решил, что это как-то связано с кодом, но я не могу понять:

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 ответ

Решение

Во-первых, если это компилируется, это потому, что защита включения в 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. Просто держи 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

Другие вопросы по тегам