我正在将游戏从 Windows 移植到 Mac。
在这里我遇到了一堆链接器错误。所有错误类似于
未定义的符号“typeinfo for Baseclass”,引用自:typeinfo for Subclass Subclass.oor
“从 _ZTVNAclass 引用的 Aclass 的虚函数表:`
我知道这个问题是因为缺少虚拟函数的定义。其工程量很大,且难以追踪未定义的虚函数。他们有什么方法可以快速识别未定义的虚拟函数。
为什么编译器不能识别未定义的虚拟函数并给出有意义的消息而不是神秘的 vtable 消息。
最小的例子:-
class Foo
{
public:
virtual ~Foo(){};
virtual void someMethod();
};
int main()
{
Foo foo;
return 0;
}
g++ 版本 4.2.1(Apple Inc. build 5664)说:-
Undefined symbols:
"vtable for Foo", referenced from:
Foo::Foo() in ccj8yYI2.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
我相信这两个错误都意味着该类具有虚函数,但没有非内联虚函数(如果您来自 Java 背景,那么很容易做到)。当 GCC 发出类中的第一个非内联虚函数时,它会发出 vtable 和(我相信)类型信息。如果所有虚拟函数都内联,则不会生成这些位。
您需要将内联虚拟函数移动到源文件并使其成为非内联。析构函数通常是一个不错的选择。
编辑:我想我误读了你的问题。暂时使您的虚拟函数成为非虚拟函数,以便链接器为该确切函数而不是虚函数表发出缺少的符号怎么样?显然,您必须记住稍后重新虚拟化它们。
编辑2:
当我尝试编译它时,我收到了一个描述性错误。您可以粘贴一个没有的最小示例吗?
class Foo
{
public:
virtual ~Foo();
};
int main()
{
Foo foo;
return 0;
}
Output:
Undefined first referenced
symbol in file
Foo::~Foo() /var/tmp//cc4C2j6B.o
vtable for Foo /var/tmp//cc4C2j6B.o
ld: fatal: Symbol referencing errors. No output written to a.out
collect2: ld returned 1 exit status
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)