解释未解决的外部C++
Interpreting unresolved externals C++
我正在尝试制作一个我的世界渲染器。从区域文件加载世界时,它将解析的 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
。反驳了我之前的断言,即未定义的引用会导致链接过程中丢失文件,它们也可能是由拼写错误引起的。
- 在函数内部的声明中初始化数组,并在外部使用它
- 使外部项目可用于find_package CMake
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- C++:来自外部文件的Trivia
- 从函数角度看ID到文件路径的内部与外部映射
- C++:将外部库链接到dll库
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 节俭并发:未解决的外部问题
- 如何在c++中从git建立外部库
- 未解析的外部符号_MsiLocateComponentW@12.
- 如何使用对C函数和类对象的外部调用来处理C++头文件
- 具有外部"c"和程序集的未定义函数
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 在C++中使用 gRPC 时未解析的外部符号
- 在类函数中初始化外部作用域变量
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 调用外部函数,无法指定类型 C++/MVS
- 同时具有"外部"和"内联"说明符的变量
- LibPrivoxy: 未解析的外部符号 __declspec(dllimport) int __stdcall Sta