解释未解决的外部C++

Interpreting unresolved externals C++

本文关键字:C++ 外部 未解决 解释      更新时间:2023-10-16

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

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

错误LNK2001未解析的外部符号"类" std::unordered_map,struct Chunk,struct std::hash>,struct std::equal_to>,class std::allocator const ,struct Chunk>>> __cdecl createChunks(class std::unordered_map,类复合标签,结构体 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。我已经包含了定义 Chunk 的标头,并且我知道需要自定义构建哈希和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上,但如果你(有理由(不想整理整个混乱,请要求澄清任何事情或额外的信息。

编辑 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:UsersnoahmsourcereposnoahwhygodwhyMCRendererMCRendererMCRenderer.obj  1   

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

unordered_map只是该函数的返回类型(和参数类型(。

顺便说一句,您似乎有一个误解,未定义的引用通常不是由缺少头文件引起的,缺少头文件会导致编译错误。未解析的外部通常是由链接步骤中缺少文件(目标文件或库文件(引起的。

更新

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