Моя проблема в том, что я получаю ошибки компоновщика без видимой причины, поэтому я просто немедленно поделюсь своим исходным кодом.
PZ_Buffer.h:
#pragma once
#include <glad/gl.h>
#include <stdint.h>
#include <vector>
class VertexBuffer
{
uint32_t m_BufferID = 0;
public:
VertexBuffer(std::vector<float> data, size_t size);
~VertexBuffer();
void Bind() const;
void Unbind() const;
};
class IndexBuffer
{
uint32_t m_BufferID = 0;
size_t m_Count = 0;
public:
IndexBuffer(std::vector<uint32_t> data, size_t size, size_t count);
~IndexBuffer();
inline size_t GetCount() { return m_Count; }
void Bind() const;
void Unbind() const;
};
PZ_Buffer.cpp:
#include "PZ_Buffer.h"
VertexBuffer::VertexBuffer(std::vector<float> data, size_t size)
: m_BufferID(0)
{
glGenBuffers(1, &m_BufferID);
glBindBuffer(GL_ARRAY_BUFFER, m_BufferID);
glBufferData(GL_ARRAY_BUFFER, size * sizeof(float), data.data(), GL_STATIC_DRAW);
}
VertexBuffer::~VertexBuffer()
{
glDeleteBuffers(1, &m_BufferID);
}
void VertexBuffer::Bind() const
{
glBindBuffer(GL_ARRAY_BUFFER, m_BufferID);
}
void VertexBuffer::Unbind() const
{
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
IndexBuffer::IndexBuffer(std::vector<uint32_t> data, size_t size, size_t count)
: m_BufferID(0), m_Count(count)
{
glGenBuffers(1, &m_BufferID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_BufferID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, size * sizeof(uint32_t), data.data(), GL_STATIC_DRAW);
}
IndexBuffer::~IndexBuffer()
{
glDeleteBuffers(1, &m_BufferID);
}
void IndexBuffer::Bind() const
{
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_BufferID);
}
void IndexBuffer::Unbind() const
{
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
Я не понимаю, почему возникает проблема, поэтому для меня практически невозможно что-либо сделать. Если это будет полезно, вот ошибки из консоли:
1>PZ_Level.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall VertexBuffer::~VertexBuffer(void)" (??1VertexBuffer@@UAE@XZ) referenced in function "public: virtual void * __thiscall VertexBuffer::`scalar deleting destructor'(unsigned int)" (??_GVertexBuffer@@UAEPAXI@Z)
1>PZ_Level.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall VertexBuffer::Bind(void)const " (?Bind@VertexBuffer@@UBEXXZ)
1>PZ_Level.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall VertexBuffer::Unbind(void)const " (?Unbind@VertexBuffer@@UBEXXZ)
1>PZ_Level.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall IndexBuffer::~IndexBuffer(void)" (??1IndexBuffer@@UAE@XZ) referenced in function "public: virtual void * __thiscall IndexBuffer::`scalar deleting destructor'(unsigned int)" (??_GIndexBuffer@@UAEPAXI@Z)
1>PZ_Level.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall IndexBuffer::Bind(void)const " (?Bind@IndexBuffer@@UBEXXZ)
1>PZ_Level.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall IndexBuffer::Unbind(void)const " (?Unbind@IndexBuffer@@UBEXXZ)
Мой компилятор — MSVC 2022, и, пожалуйста, не закрывайте его без предупреждения, спасибо.
Обновлено: я прочитал документацию Microsoft по этой ошибке и основные ответы на вопрос, который я предположительно продублировал, и они не решают мою проблему; если проблема в моем компиляторе, объясните подробно.
Ошибка компоновщика не имеет никакого отношения к библиотекам, которые я связал, однако вот исходный код: github.com/pmanpnd/pz.
Что ж, судя по всему, вам либо не хватает классов VertexBuffer и IndexBuffer, либо библиотеки, предназначенной для их предоставления.
Ни одна библиотека не предназначалась для их предоставления, и я проверил файл .vcxproject, в котором определенно были файлы PZ_Buffer .h и .cpp.
Вам необходимо связать вместе весь соответствующий объектный код/файлы — будь то библиотеки или ваш собственный код.
Я проверил файл .vcxproject и связал все, что нужно, я запускаю проект из Visual Studio, а не из консоли.
Попробуйте полностью чистую сборку.
Как обычно для других ОП по SO, вы проигнорировали верхние сообщения в выводе сборки. pz\bin\obj\Debug\x64\PZ_Buffer.obj : warning LNK4042: object specified more than once; extras ignored
- у вас есть два файла, которые скомпилированы в один PZ_Buffer.obj
, в одном из них нет необходимых определений функций.
@273K Итак, можете ли вы сказать мне, как это исправить, если вы считаете, что решение есть.
Проблема в том, что тип элемента для PZ_Buffer.h установлен на компилятор C/C++ и генерирует еще один конфликтующий PZ_Buffer.obj без определений функций.
Он должен быть установлен в заголовок C/C++.
Проблема все еще актуальна :(.
Нет. Теперь вам следует пересобрать проект, чтобы обновить PZ_Buffer.obj.
Да, imgur.com/a/dcKmD0t.
Это не. Я только что проверил ваше репо. На картинке не видно, что вы пересобрали решение. Не спорьте. Возможно, теперь вы получаете другие ошибки. Также удалите bin из проекта. Почему вы добавляете туда .obj?
Хорошо, спасибо, я удалил bin, и теперь все заработало.
Добавьте файлы PZ_Buffer.* в проект.