簡體   English   中英

解釋未解析的外部 C++

[英]Interpreting unresolved externals C++

我在制作我的世界渲染器時有一個 go。 從區域文件加載世界時,它將解析的 NBT 數據存儲在無序的 map 中,其中 nbt 數據作為值,全局塊坐標作為鍵。 特別unordered_map<pair<int, int>, CompoundTag*> (復合標簽是 NBT 數據)

但是,我遇到了似乎指向無序 map 的編譯時錯誤。 如下。

錯誤 LNK2001 未解析的外部符號“類 std::unordered_map,struct Chunk,struct std::hash >,struct std::equal_to >,class std::allocator const,struct Chunk> >: 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?$分配器@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 的 header,並且我知道需要自定義構建 hash 和 equal_to 函數,並在 Z099FB995346F31C749F6E40E40DB0F 文件中為它們提供了以下內容。

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   

錯誤消息很長,但如果您仔細閱讀,它指的是缺少的 function 稱為createChunks

unordered_map 只是 function 的返回類型(和參數類型)。

順便說一句,您似乎有一個誤解,未定義的引用通常不是由缺少 header 文件引起的,缺少 header 文件會導致編譯錯誤。 未解析的外部通常是由於鏈接步驟中缺少文件(目標文件或庫文件)造成的。

更新

查看您的代碼后,我可以看到問題是一個錯字。 chunkPipeline.hpp你聲明一個 function createChunks但在chunkPipeline.cpp相同的 function 被稱為createChunk 反駁我之前的斷言,即未定義的引用是在鏈接期間導致丟失文件的,它們也可能是由拼寫錯誤引起的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM