NDK开发之 Undefined Reference to Typeinfo

最近给现在代码增加个功能,可以使用代理走向内网指定服务器,但是功能增加后一直编译不过,报错:"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中新增加的两行代码, 发现没有定义成纯虚函数,修改成纯虚函数即可。

修改前:

class HttpClient {
public:
    virtual void setProxy(const char *proxy);
    virtual void setProxyExtraHeader(const char *proxyExtraHeader);

};

修改后:

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券