[英]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.