解释未解决的外部 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
。反驳我之前关于未定义的引用是在链接过程中导致丢失文件的断言,它们也可能是由拼写错误引起的。
我正在尝试制作 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
。反驳我之前关于未定义的引用是在链接过程中导致丢失文件的断言,它们也可能是由拼写错误引起的。