前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >NDK开发之 Undefined Reference to Typeinfo

NDK开发之 Undefined Reference to Typeinfo

作者头像
望天
发布2019-08-01 11:12:21
2.1K0
发布2019-08-01 11:12:21
举报
文章被收录于专栏:along的开发之旅along的开发之旅

最近给现在代码增加个功能,可以使用代理走向内网指定服务器,但是功能增加后一直编译不过,报错:"Undefined Reference to Typeinfo HttpClient", 很奇怪,代码看着没什么问题,就是编译不过。CPP最烦的就是不说人话。。。要让你去猜

查了网上的资料, 发生这种情况一般是 :

虚函数未实现

产生”undefined reference to `typeinfo for xxx’“最常见的原因就是基类的虚函数未实现了。由于C++类的实现可以分布在多个源文件中,所以生成目标文件时,基类的虚函数没有定义是不会报错的。但是链接成可执行文件时,需要将虚函数的信息放进typeinfo中,这个时候虚函数未实现就会引发这个错误。

混用了no-RTTI代码和RTTI代码

我碰到的正是混用了no-RTTI和RTTI代码的情形。项目中我们自己写的程序必须开启RTTI,而我们使用的外部的一个库使用no-RTTI编译。我们在自己的代码中需要重载一个外部库中的带虚函数的类,结果链接的时候就出现了问题。外部库中的基类使用-fno-rtti选项编译,生成的代码没有typeinfo信息,而我们的代码使用-frtti选项编译,要求基类必须要有typeinfo信息。最后,我在编译系统中做了一些dirty hack,让那个派生类所在的源文件以-fno-rtti选项编译,解决了问题。

但是我的子类都实现了父类的方法,而且在添加之前编译也是没问题的,所以这两种都不是我的情况。

后来又将目光放到HttpClient中新增加的两行代码, 发现没有定义成纯虚函数,修改成纯虚函数即可。

修改前:

代码语言:javascript
复制
class HttpClient {
public:
    virtual void setProxy(const char *proxy);
    virtual void setProxyExtraHeader(const char *proxyExtraHeader);

};

修改后:

代码语言:javascript
复制
class HttpClient {
public:
    virtual void setProxy(const char *proxy) = 0;
    virtual void setProxyExtraHeader(const char *proxyExtraHeader) = 0;

};

参考

https://blog.csdn.net/ai2000ai/article/details/47152133

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年07月23日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 虚函数未实现
  • 混用了no-RTTI代码和RTTI代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档