解释未解决的外部 C++

Interpreting unresolved externals C++

我正在尝试制作 Minecraft 渲染器。当从区域文件加载世界时,它将解析的 NBT 数据存储在无序地图中,以 nbt 数据为值,全局块坐标为键。具体来说unordered_map<pair<int, int>, CompoundTag*>(复合标签是NBT数据)

但是,我 运行 遇到了似乎指向无序映射的编译时错误。具体如下。

Error LNK2001 unresolved external symbol "class std::unordered_map,struct Chunk,struct std::hash >,struct std::equal_to >,class std::allocator const ,struct Chunk> > > __cdecl createChunks(class std::unordered_map,class CompoundTag,struct std::hash >,struct std::equal_to >,class std::allocator const ,class 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。我已经包含了定义块的 header,并且我知道需要自定义构建哈希和 equal_to 函数,并在 header 文件中为它们提供了以下内容包括在内。

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 上,如果你想从整体上看这个项目,但如果你(有理由)不想整理整个混乱,请只要求澄清任何事情或额外信息。

编辑 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   

错误消息很长,但如果您仔细阅读它,它指的是一个名为 createChunks.

的缺失函数

unordered_map 只是该函数的 return 类型(和参数类型)。

顺便说一句,你好像有一个误会,未定义的引用一般不是头文件丢失引起的,头文件丢失会导致编译错误。未解析的外部通常是由于链接步骤中缺少文件(目标文件或库文件)造成的。

更新

查看了您的代码,我发现问题是拼写错误。在 chunkPipeline.hpp 中,您声明了一个函数 createChunks,但在 chunkPipeline.cpp 中,相同的函数被称为 createChunk。反驳我之前关于未定义的引用是在链接过程中导致丢失文件的断言,它们也可能是由拼写错误引起的。