前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android NDK ?developer/article/1173578/undefined reference to ___tls_get_addr 错误

Android NDK ?developer/article/1173578/undefined reference to ___tls_get_addr 错误

作者头像
owent
发布2018-08-01 16:20:15
1.1K0
发布2018-08-01 16:20:15
举报
文章被收录于专栏:owentowent

本来看到Android的ndk都开始用gcc4.8和gcc4.9了,而且gcc4.8.1开始支持全部的c++11的特性,我就很happy地用上了。结果出现这么个错误。

网上查到说是Android的run time竟然不支持 thread local storage(TLS),更准确地说,是它没实现。

而我这里需要用TLS来做内存通道无锁队列的数据统计(还好去掉以后只是统计不准)

再查文档下来,原来是android的run time没有用gnu的glibc,而是用得Google自己实现的Bionic,这货很多功能没有实现,留了空接口。

根据维基百科上的说法,Boinic没实现的还不止这个。比glibc而言还不支持的功能还有:

  • 不支持异常处理
  • 无标准模板(这个可以用gnustl或者stlport代替)
  • 不支持宽字符(貌似用处不大,现在主流UTF-8了)
  • 据说它比glibc速度快(也不知道快多少) 真是留下了茫茫多坑呐,而且还不知道是不是有其他什么不支持的功能。

目前的解决方案比较暴力不完美,就是在TLS的地方排除Android平台

代码语言:javascript
复制
#if defined(__ANDROID__)
// android 不支持tls
#define THREAD_TLS
#elif defined(__clang__)
#define THREAD_TLS __thread
#elif defined(__cplusplus) && __cplusplus >= 201103L
#define THREAD_TLS thread_local
// VC 2003
#elif defined(_MSC_VER) && (_MSC_VER >= 1300)
#define THREAD_TLS __declspec( thread )
#else
#define THREAD_TLS __thread
#endif

具体见: https://github.com/owent-utils/c-cpp/blob/master/include/std/thread.h

本文参与?腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-02-06,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

本文参与?腾讯云自媒体同步曝光计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com