Интерпретация неразрешенных внешних объектов C ++ - PullRequest
1 голос
/ 28 мая 2020

У меня go при создании рендерера minecraft. При загрузке мира из файлов региона он сохраняет проанализированные данные NBT на неупорядоченной карте с данными nbt в качестве значения и глобальными координатами блока в качестве ключа. В частности, unordered_map<pair<int, int>, CompoundTag*> (составной тег является данными NBT)

Однако я столкнулся с ошибкой времени компиляции, которая, кажется, указывает на неупорядоченную карту. Это выглядит следующим образом.

Ошибка LNK2001 неразрешенный внешний символ "class std :: unordered_map, struct Chunk, struct std :: ha sh>, struct std :: equal_to>, class std :: распределитель const, struct Chunk>>> __cdecl createChunks (класс std :: unordered_map, класс CompoundTag, struct std :: ha sh>, struct std :: equal_to>, класс std :: allocator const, класс CompoundTag>>> & , class Asset &) "(? createChunks @@ YA? AV? $unordered_map@U?$pair@HH@std@@UChunk@@U? $hash@U?$pair@HH@std@@@2@U? $equal_to@U?$pair@HH@std@@@2@V? $allocator@U? $ pair @ $$ CBU? $pair@HH@std@@UChunk@@@std@@@2@@std@@AEAV? $unordered_map@U?$pair@HH@std@@VCompoundTag@@U? $hash@U?$pair@HH@std@@@2@U? $equal_to@U?$pair@HH@std@@@2@V? $allocator@U? $ pair @ $$ CBU? $pair@HH@std@@VCompoundTag@@@std@@@2@@2@AEAVAsset@@@Z)

Я решил неразрешенные внешние проблемы раньше, и обычно это потому, что я забыл включить внешний файл (отсюда и название), который нужен программе. Однако на этот раз я почти уверен, что у меня есть все необходимое. Я включил unordered_map в начало файла. Я включил заголовок, в котором определен Chunk, и я знаю о необходимости пользовательской сборки ha sh и функций equal_to, и предоставил им следующее в включаемом файле заголовка.

namespace std
{
    template<>
    struct hash<pair<int32_t, int32_t>>
    {
        size_t operator ()(const pair<int32_t, int32_t>& value) const
        {
            uint64_t key = ((uint64_t)value.first) << 32 | (uint64_t)value.second;
            key ^= (key >> 33);
            key *= 0xff51afd7ed558ccd;
            key ^= (key >> 33);
            key *= 0xc4ceb9fe1a85ec53;
            key ^= (key >> 33);
            return (size_t)key;
        }
    };


    template<>
    struct equal_to<pair<int32_t, int32_t>>
    {
        bool operator ()(const pair<int32_t, int32_t>& v1, const pair<int32_t, int32_t>& v2) const
        {
            return (v1.first == v2.first) && (v1.second == v2.second);
        }
    };
}

Единственное, что, как я думал, мне может понадобиться, - это предоставить собственный распределитель? Но все, что я нашел об использовании пар в качестве ключей в unordered_maps, говорит о том, что в этом нет необходимости. Я немного озадачен и буду благодарен за любую информацию. Если у вас есть вопросы или вы хотите увидеть больше кода, пожалуйста, задавайте их. Это на моем github , если вы хотите взглянуть на проект в целом, но если вы (справедливо) не хотите разбираться во всем этом беспорядке, просто попросите разъяснений по чему-либо или дополнительной информации.

Edit 1, я как мог разобрал ошибку.

class std::unordered_map
<
    struct std::pair
    <
        int,
        int
    >,
    struct Chunk *,
    struct std::hash
    <
        struct std::pair
        <
            int,
            int
        > 
    >,
    struct std::equal_to
    <
        struct std::pair
        <
            int,
            int
        >
    >,
    class std::allocator
    <
        struct std::pair
        <
            struct std::pair
            <
                int,int
            > const,
            struct Chunk *
        > 
    > 
>

__cdecl createChunks(
    class std::unordered_map
    <
        struct std::pair
        <
            int,
            int
        >,
        class CompoundTag *,
        struct std::hash
        <
            struct std::pair
            <
                int,
                int
            >
        >,
        struct std::equal_to
        <
            struct std::pair
            <
                int,
                int
            >
        >,
        class std::allocator
        <
            struct std::pair
            <
                struct std::pair
                <
                    int,
                    int
                > const,
                class CompoundTag *
            > 
        > 
    >&
    ,class Asset&
) 


(?createChunks@@YA?AV?$unordered_map@U?$pair@HH@std@@PEAUChunk@@U?$hash@U?$pair@HH@std@@@2@U?$equal_to@U?$pair@HH@std@@@2@V?$allocator@U?$pair@$$CBU?$pair@HH@std@@PEAUChunk@@@std@@@2@@std@@AEAV?$unordered_map@U?$pair@HH@std@@PEAVCompoundTag@@U?$hash@U?$pair@HH@std@@@2@U?$equal_to@U?$pair@HH@std@@@2@V?$allocator@U?$pair@$$CBU?$pair@HH@std@@PEAVCompoundTag@@@std@@@2@@2@AEAVAsset@@@Z)    MCRenderer  C:\Users\noahm\source\repos\noahwhygodwhy\MCRenderer\MCRenderer\MCRenderer.obj  1   

1 Ответ

2 голосов
/ 28 мая 2020

Сообщение об ошибке длинное, но если вы внимательно его прочитаете, оно относится к отсутствующей функции с именем createChunks.

unordered_map - это просто тип возвращаемого значения (и тип параметра) этой функции.

Кстати, вы, кажется, неправильно поняли, неопределенные ссылки обычно не вызваны отсутствием файлов заголовков, отсутствие файла заголовка может вызвать ошибку компиляции. Неразрешенные внешние факторы обычно возникают из-за отсутствия файлов (объектных файлов или файлов библиотеки) на этапе связывания.

ОБНОВЛЕНИЕ

Посмотрев ваш код, я вижу, что проблема это опечатка. В chunkPipeline.hpp вы объявляете функцию createChunks, но в chunkPipeline.cpp та же функция называется createChunk. Опровергая мое более раннее утверждение о том, что неопределенные ссылки являются причиной отсутствия файлов во время компоновки, они также могут быть вызваны опечатками.

...