2013-08-22 73 views
0

我做了一个自定义的C++框架我想一个C中使用++使用的Xcode 4,但是应用程序开发,我最近遇到了一些麻烦:我获得三个链接器的错误,我无法解决,这样的:的Xcode定制的框架奇怪部分链接错误

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! 

我已经删除了派生数据文件夹,清理了项目并删除了与项目一起放置的构建文件夹。

有什么建议吗?

在此先感谢!

更新:总结一下这个问题,你可能会说当链接器被命名为“run”时链接器不能“看到”实现 - 当它被称为别的东西时(比如runX()), ,所以如果我在头文件(.h)文件中执行run(),然后调用解决问题的方法runX(在cpp文件中实现)。这看起来像是一个编译器和/或链接器的bug。

+0

嗯,你可以发布一个示例项目吗?很难说没有更多的代码。 –

+0

我还没有能够通过重写所有相关部分来重现较小/示例项目中的错误,所以我猜错误可能是由于项目的复杂性质而发生的。这是太多的代码来发布它,虽然在目前的形式。有没有其他方法可以验证链接器为什么会这样?就好像链接器只会根据它们的名称“看到”某些方法实现(而不是其他方法)。奇怪,我想。 – Jonas

+0

是的,它看起来像重新实现(runX)方法的方法使链接器看到基类中的实现。否则,实施失踪。我想知道它是否无法找到它的B/C的实施是在一个框架。也许添加一个静态库,而不是你的目标,并在你的应用程序中使用它? –

回答

0

下面是关于正在发生的事情与虚函数表,虚函数和继承一个伟大的职位:

http://arsenmk.blogspot.com/2013/02/a-little-more-about-virtual-functions.html

此外,您还可以看到链接程序将与“otool”和“纳米”是什么AT命令命令行。如:

$ 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?