Xcode自定义框架奇怪的部分链接器错误

时间:2013-08-22 17:44:20

标签: xcode frameworks linker

我已经创建了一个自定义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文件中实现)来解决问题。对我来说,这似乎是一个编译器和/或链接器错误。

1 个答案:

答案 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命令的选项和输出的一些不错的运行:

http://pic.dhe.ibm.com/infocenter/aix/v7r1/index.jsp?topic=%2Fcom.ibm.aix.cmds%2Fdoc%2Faixcmds4%2Fnm.htm

What does "symbol value" from nm command mean?