我做了一个自定义的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。
嗯,你可以发布一个示例项目吗?很难说没有更多的代码。 –
我还没有能够通过重写所有相关部分来重现较小/示例项目中的错误,所以我猜错误可能是由于项目的复杂性质而发生的。这是太多的代码来发布它,虽然在目前的形式。有没有其他方法可以验证链接器为什么会这样?就好像链接器只会根据它们的名称“看到”某些方法实现(而不是其他方法)。奇怪,我想。 – Jonas
是的,它看起来像重新实现(runX)方法的方法使链接器看到基类中的实现。否则,实施失踪。我想知道它是否无法找到它的B/C的实施是在一个框架。也许添加一个静态库,而不是你的目标,并在你的应用程序中使用它? –