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.
- Снимите защиту включения с
shader.cpp
- так как вы определяетеSHADER_H
вshader.h
препроцессор удалит весь код изshader.cpp
прежде чем он попадает в компилятор Удалите объявление класса из shader.cpp, но сохраните определения всех членов класса shader. Просто держи
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