unresolved external symbol в C++ на пустом месте

145
01 июля 2021, 12:00

В коде не существует ничего под именнем _DXGI_DEBUG_ALL или в чего то в этом духе, существует только DXGI_DEBUG_ALL (без нижнего подчеркивания). При линковке в Visual Studio 2019, выдает:

LNK2001 | unresolved external symbol _DXGI_DEBUG_ALL | DxgiInfoManager.obj | Line: 1
LNK2120 | 1 unresolved externals                     | DxgiInfoManager.obj | Line: 1

И вот что ты не поделаешь, а оно всеравно ругаеться на подчеркивание!

КОД DxgiInfoManager.h:

#pragma once
#include "Win.h"
#include <wrl.h>
#include <string>
#include <vector>
#include <dxgidebug.h>
class DxgiInfoManager
{
public:
    DxgiInfoManager();
    ~DxgiInfoManager();
    DxgiInfoManager(const DxgiInfoManager&) = delete;
    DxgiInfoManager& operator=(const DxgiInfoManager&) = delete;
    void Set() noexcept;
    std::vector<std::string> GetMesssages() const;
private:
    unsigned long long next = 0u;
    struct IDXGIInfoQueue* pDxgiInfoQueue = nullptr;
};

КОД DxgiInfoManager.cpp:

#include "DxgiInfoManager.h"
#include "Window.h"
#include "Graphics.h"
#include <dxgidebug.h>
#include <memory>
#include <dxgidebug.h>
#define GFX_THROW_NOINFO(hrcall) if( FAILED( hr = (hrcall) ) ) throw Graphics::HrException( __LINE__,__FILE__,hr )
DxgiInfoManager::DxgiInfoManager()
{
    // define function signature of DXGIGetDebugInterface
    typedef HRESULT(WINAPI * DXGIGetDebugInterface)(REFIID, void**);
    // load the dll that contains the function DXGIGetDebugInterface
    const auto hModDxgiDebug = LoadLibraryEx("dxgidebug.dll", nullptr, LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR);
    if (hModDxgiDebug == nullptr)
    {
        throw WND_LAST_EXCEPT();
    }
    // get address of DXGIGetDebugInterface
    const auto DxgiGetDebugInterface = reinterpret_cast<DXGIGetDebugInterface>(
        reinterpret_cast<void*>(GetProcAddress( hModDxgiDebug, "DXGIGetDebugInterface" ))
    );
    if (DxgiGetDebugInterface == nullptr)
    {
        throw WND_LAST_EXCEPT();
    }
    HRESULT hr;
    GFX_THROW_NOINFO(DxgiGetDebugInterface(__uuidof(IDXGIInfoQueue), reinterpret_cast<void**>(&pDxgiInfoQueue)));
}
DxgiInfoManager::~DxgiInfoManager()
{
}
void DxgiInfoManager::Set() noexcept
{
    // set the index (next) so that the next all to GetMessage()
    // will only get errors generated after this all
    next = pDxgiInfoQueue->GetNumStoredMessages(DXGI_DEBUG_ALL);
}
std::vector<std::string> DxgiInfoManager::GetMesssages() const
{
    std::vector<std::string> messages;
    const auto end = pDxgiInfoQueue->GetNumStoredMessages(DXGI_DEBUG_ALL);
    for (auto i = next; i < end; i++)
    {
        HRESULT hr;
        SIZE_T messageLength;
        // get the size of a messsage i in bytes
        GFX_THROW_NOINFO(pDxgiInfoQueue->GetMessage(DXGI_DEBUG_ALL, i, nullptr, &messageLength));
        // alocate memory for message
        auto bytes = std::make_unique<byte[]>(messageLength);
        auto pMessage = reinterpret_cast<DXGI_INFO_QUEUE_MESSAGE*>(bytes.get());
        // get the message and push its description into vector
        GFX_THROW_NOINFO(pDxgiInfoQueue->GetMessage(DXGI_DEBUG_ALL, i, pMessage, &messageLength));
        messages.emplace_back(pMessage->pDescription);
    }
    return messages;
}

Если потребуеться дополнительная информация, постараюсь добавить как можно скорее :)

Answer 1

В C/C++ x86 глобальные переменные и "C"-функции, при трансляции в ассемблер, получают префикс "_" . У вас переменная DXGI_DEBUG_ALL видимо описана, как extern, но нигде не размещена.

То есть переменную DXGI_DEBUG_ALL надо указать в каком-то cpp файле без extern

Answer 2

Добавьте dxguid.lib в список библиотек для линковки.

READ ALSO
Build pcre2(10.33) static library for multi-width application

Build pcre2(10.33) static library for multi-width application

Столкнулся с проблемой сборки библиотеки pcre2, с параметром PCRE2_CODE_UNIT_WIDTH 0, для UTF-8, UTF-16, UTF-32, сборка проходит без проблем, однако при сборке для...

174
Как передать объекту ссылку

Как передать объекту ссылку

Возможно глупый вопрос, не судите строгоВ общем, у меня есть объект на него нужно передать ссылку этого-же типа

303
Контент сайта и его фон

Контент сайта и его фон

Я новичок в верстке,так что помидорами не кидайтесь) Как сделаны такие сайты, что слева и справа находится очень длинный фон, а по середине...

79
Некорректное добавление записей в БД

Некорректное добавление записей в БД

Хочу передать значение некоторых полей в таблицу своей БДПроблема в том, что добавляется только две записи и не более, даже если объектов...

105