LNK2001 (и другие ошибки компоновщика) без видимой причины

Моя проблема в том, что я получаю ошибки компоновщика без видимой причины, поэтому я просто немедленно поделюсь своим исходным кодом.

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 по этой ошибке и основные ответы на вопрос, который я предположительно продублировал, и они не решают мою проблему; если проблема в моем компиляторе, объясните подробно.

Добавьте файлы PZ_Buffer.* в проект.

3CxEZiVlQ 13.04.2024 19:29

Ошибка компоновщика не имеет никакого отношения к библиотекам, которые я связал, однако вот исходный код: github.com/pmanpnd/pz.

m_abid 13.04.2024 19:40

Что ж, судя по всему, вам либо не хватает классов VertexBuffer и IndexBuffer, либо библиотеки, предназначенной для их предоставления.

Christian Stieber 13.04.2024 20:07

Ни одна библиотека не предназначалась для их предоставления, и я проверил файл .vcxproject, в котором определенно были файлы PZ_Buffer .h и .cpp.

m_abid 13.04.2024 20:12

Вам необходимо связать вместе весь соответствующий объектный код/файлы — будь то библиотеки или ваш собственный код.

G.M. 13.04.2024 20:13

Я проверил файл .vcxproject и связал все, что нужно, я запускаю проект из Visual Studio, а не из консоли.

m_abid 13.04.2024 20:20

Попробуйте полностью чистую сборку.

drescherjm 13.04.2024 20:20

Как обычно для других ОП по SO, вы проигнорировали верхние сообщения в выводе сборки. pz\bin\obj\Debug\x64\PZ_Buffer.obj : warning LNK4042: object specified more than once; extras ignored - у вас есть два файла, которые скомпилированы в один PZ_Buffer.obj, в одном из них нет необходимых определений функций.

3CxEZiVlQ 13.04.2024 20:21

@273K Итак, можете ли вы сказать мне, как это исправить, если вы считаете, что решение есть.

m_abid 13.04.2024 20:28
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
9
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что тип элемента для PZ_Buffer.h установлен на компилятор C/C++ и генерирует еще один конфликтующий PZ_Buffer.obj без определений функций.

Он должен быть установлен в заголовок C/C++.

Проблема все еще актуальна :(.

m_abid 13.04.2024 20:43

Нет. Теперь вам следует пересобрать проект, чтобы обновить PZ_Buffer.obj.

3CxEZiVlQ 13.04.2024 20:45

Да, imgur.com/a/dcKmD0t.

m_abid 13.04.2024 20:56

Это не. Я только что проверил ваше репо. На картинке не видно, что вы пересобрали решение. Не спорьте. Возможно, теперь вы получаете другие ошибки. Также удалите bin из проекта. Почему вы добавляете туда .obj?

3CxEZiVlQ 13.04.2024 20:57

Хорошо, спасибо, я удалил bin, и теперь все заработало.

m_abid 13.04.2024 21:05

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