只有一些内联函数无法解析

LNK2001 Only some inline functions unresolved?

本文关键字:函数      更新时间:2023-10-16

这个问题已经存在一段时间了,但我还没有找到任何真正的解决方案。基本上,我有几个类,它们大约有10-20个内联函数,每个函数只从类中检索简单的信息。它们都是单行函数它们都用不同的参数做同样的事情。大多数情况下,它们可以很好地编译,但偶尔编译器会在具有相同定义的函数中间指出一些未解决的问题。

例如,下面是我的类头定义的一部分,它具有公共作用域:

...
inline uint32_t debug_offset();
inline uint32_t debug_load_addr();
inline uint32_t dol_offset();
inline uint32_t fst_offset();
inline uint32_t fst_size();
inline uint32_t fst_max_size();
...

它们的定义如下:

...
uint32_t Header::debug_offset()
{
    return VectorData::read<uint32_t>(ref(header), Offset::DebugOffset);
}
uint32_t Header::debug_load_addr()
{
    return VectorData::read<uint32_t>(ref(header), Offset::DebugAddress);
}
uint32_t Header::dol_offset()
{
    return VectorData::read<uint32_t>(ref(header), Offset::DOLOffset);
}
uint32_t Header::fst_offset()
{
    return VectorData::read<uint32_t>(ref(header), Offset::FSTOffset);
}
uint32_t Header::fst_size()
{
    return VectorData::read<uint32_t>(ref(header), Offset::FSTSize);
}
uint32_t Header::fst_max_size()
{
    return VectorData::read<uint32_t>(ref(header), Offset::FSTMaxSize);
}
...

所有这些都可以很好地与其他20个左右类似的函数一起编译,除了fst_offset抛出这个错误:

Error   1   error LNK2001: unresolved external symbol "public: unsigned int __thiscall Header::fst_offset(void)" (?fst_offset@Header@@QAEIXZ)

这也发生在其他几个类中。当所有的内联函数都正常时,我会有一两个函数抛出这个错误。简单的修复方法是只使用抛出错误的函数,并将body放在header中,但这会改变项目的布局,使其不一致。

这是一个编译错误吗?我是不是做了什么不一样的事而我却不知道?如果可能的话,我想避免在头文件中定义一些函数,而在源文件中定义另一些函数。

我想完整地回答这个问题,而不是仅仅根据我的发现接受一个非常基本的答案。

我最初的项目想要避免在单个类定义中混合函数原型和函数声明。要做到这一点,我试图在cpp文件中定义内联函数,就像你将正常函数一样,显然不起作用。

作为妥协,我发现您可以在头文件中定义函数,然后在类定义之外放置函数声明,就像在cpp文件中一样。这可能就是我在cpp文件中放入内联函数时所想到的。

的例子:

// example.h
class Example
{
public:
    void foo();
    void bar(); // Not defined in header, has to be in cpp file and non-inline
}
// Outside Example class definition.
inline void Example::foo()
{
    // Code
}

根据我的理解,如果你使用内联,你必须在头文件中定义函数,而不仅仅是声明它。