我已经创建了一个自定义c ++框架,我正在尝试在使用Xcode 4开发的c ++应用程序中使用。但是,我最近遇到了一些麻烦:我遇到了三个我无法解决的链接器错误,像这样:
Undefined symbols for architecture x86_64:
"non-virtual thunk to netlib::base::BaseSocket::run()", referenced from:
vtable for NetworkClient in network_client.o
我在框架中声明了这个类NetworkThread,它有一个抽象方法run()。框架内的另一个类BaseSocket继承自NetworkThread并实现此方法。第三类NetworkClient是在使用框架的应用程序中创建的 - 而不是在框架本身内 - 并且继承自BaseSocket类,但是编译它会触发上面提到的链接器错误。
我非常清楚如何解决链接器错误,但现在对于这个问题的奇怪部分:我只是在类BaseSocket中的部分实现上遇到链接器错误 - 一些方法工作正常(甚至我添加的新方法,证明框架及其路径设置正确)。我找到了解决链接器错误的解决方法。这是发生错误时头文件声明(BaseSocket)的样子:
void run() override; // Will cause linker error
当我像这样更改标题(并将实现中的方法重命名为runX)时,它可以正常工作:
void run() override { this->runX(); }
void runX(); // Works like a charm!
我删除了派生数据文件夹,清理了项目并删除了随项目放置的build-folder。
有什么建议吗?
提前致谢!
更新:总结一下您可能会说链接器无法在方法被命名为“run”时“看到”实现的问题 - 当它被称为其他东西时它正常工作(runX( )例如),所以如果我在头(.h)-file中执行run(),然后调用方法runX(在cpp文件中实现)来解决问题。对我来说,这似乎是一个编译器和/或链接器错误。
答案 0 :(得分:0)
这是关于vtable,虚函数和继承的一个很好的帖子:
http://arsenmk.blogspot.com/2013/02/a-little-more-about-virtual-functions.html
此外,您可以在命令行中查看链接器使用“otool”和“nm”命令看到的内容。如:
$ nm /path/to/your.o
它将输出一个符号列表,其中“U”表示未定义的符号,如:
000000000000001b T foo
0000000000000000 T main
U printf
这是nm命令的选项和输出的一些不错的运行: