NDK编译器由gcc改为clang造成的STL兼容性问题

Android NDK 开发:深入解析 NDK 与 Clang 版本兼容性与编译问题排查 本文深入解析Android NDK与Clang编译器的版本兼容性问题,提供详细的NDK与Clang版本对照表,并分享常见编译错误(如符号缺失、ABI不匹配)的排查方法与最佳实践,帮助开发者高效解决NDK开发中的版本冲突问题。 阅读详情

最近做NDK项目时,遇到了个很让人恼火的问题,调用动态库时,一旦API参数使用了STL容器,就无法链接。报错类似

undefined reference to ‘Func(std::__1::vector&)’

反复检查API文档与自己的程序,并未发现参数不一致的情况。检查库的依赖关系,也一切正常。最后使用

arm-linux-androideabi-nm -D -C foobar.so

-D:动态库,-C:还原经过Name mangling的函数名

导出动态库中的函数名后发现,库的函数名为

Func(std::vector&)

与上文的报错信息相比,少了“__1”,命名空间分别为std和std::__1,由于命名空间的不同导致了编译器找不到函数的实现。

查找资料后发现,从Android 7.1.1 r13的SDK开始,NDK的默认编译器由gcc更换为了clang。clang的stl实现不同于gcc的libstdc++,而是libc++。两者对STL的实现方式不同。为保证二进制兼容性, clang通过内联命名空间为自己的STL实现增加了std::__1的前缀。

In order to turn this run time crash into a link time error, libc++ uses a C++ 11 language feature called inline namespace to change the ABI of std::string without impacting the API of std::string. That is, to you std::string looks the same. But to the linker, std::string is being mangled as if it is in namespace std::__1. Thus the linker knows that std::basic_string and std::__1::basic_string are two different data structures (the former coming from gcc’s libstdc++ and the latter coming from libc++).

解决方案有两个,一是使用clang重新编译该动态库,二是编译该工程时,加入clang编译器选项stdlib=libstdc++,使用与动态库相同的STL实现。

参考文献

https://stackoverflow.com/questions/8454329/why-cant-clang-with-libc-in-c0x-mode-link-this-boostprogram-options-examp
https://stackoverflow.com/questions/31617034/stdfuture-and-clang-with-stdlib-libstdc
https://zhuanlan.zhihu.com/p/27470060

NDK 交叉编译 Android NDK 是一个工具集,可让您使用 C 和 C++ 等语言以原生代码实现应用的各个部分。对于特定类型的应用,这可以帮助您重复使用以这些语言编写的代码库。 1. ubuntu android交叉编译c程序 ndk http://blog.chinaunix.net/uid-20718384-id-3324194.html 2.NDK下载 https://developer.android.google.cn/ndk/downloads/ 3.Ubuntu下Android NDK环境搭建笔记 阅读详情

相关推荐

Linux下Android NDK r23b部署与编译实战:从zip到.so

交叉编译是Android原生开发的核心技术,NDK作为官方工具链,其版本选择和部署方式直接影响工程效率。在Linux服务器或CI环境中,手动下载android-ndk-r23b-linux.zip并配置工具链是基础操作。NDK r23b全面转向Clang/LLVM,移除了GCC支持,同时带来独立工具链脚本的变更,因此掌握其部署与验证方法至关重要。本文从NDK基本概念入手,讲解Linux环境下zip包的下载、校验、解压与环境变量配置,演示如何利用内置的clang wrapper编译JNI动态库,并分析从r21

weixin_29196315的博客 339

Android Studio Native工程报错:undefined reference to std::__ndk1::basic_string

错误截图: 有时候在引入so动态库的时候,出现上图的错误,编译库的时候指定APP_STL := c++_shared; 在Application.mk中: APP_STL := c++_shared

caifubing的博客 5493

最终篇——SWAT模型的建立

同理,Soil Data也是同样的方法导入,在Soil Database Options的选项中,选择UserSiol,用同样的方法导入土壤类型,进行重分类。打开窗口后,只定义HRU Thresholdes,其余两个不用设置,设定各数据单元的计算率,这里的10%的意思是计算精度,即分成级HRU计算单元太小,小于平均计算单元的10%,我们就不对这HRU单元进行计算(也就是说太破碎的计算单元不进行计算),若选择0%意味着全部进行计算,需要耗费大量的内存和时间,对计算机要求较高,不建议。

m0_72556434的博客 5621

android针对c++ stl支持的配置

Android NDK从r5b版本开始有官方支持的STL了,有一个crystax版本早已经支持。官方的支持有两个版本一个是gnu的,一个是stlport。如果你需要在你的NDK程序中使用STL,那么需要在Application.mk文件中添加一个选项,就是APP_STL := stlport_static。 其中APP_STL的取值有以下四种:     system --> 系统默认的最小支持的

4343

深度强化学习系列(13): 策略梯度(Policy Gradient)

对于DQN来说使用一个网络直接逼近了值函数,最后取得了非常不错的效果, 但是对于一些连续性控制或者动作空间特别大的环境来说,很难全部计算所有的值函数来得到最好的策略,那么直接计算策略的方法就别提出来了。 回顾一下前面几篇,所谓的策略,其实就是状态到动作的映射数学表达为 π:s→aπ:s→a\pi : s \to a, 我们用ττ\tau 表示状态s到最后一个状态的一个序列,表示为: τ:st...

深度强化学习(DeepRL)探索博客 4642

2026开源API网关横评:微服务与AI流量治理如何选型

API网关作为微服务架构的流量入口,承担着路由转发、安全管控、限流熔断等核心职责,是分布式系统治理的基础设施。随着大模型应用的普及,AI流量对网关提出了新的要求,如流式响应支持、Token级限流、多模型路由和成本分账等能力。传统网关通过插件拼凑AI功能,而AI原生网关则将这些能力内建。面对众多开源方案,如何根据业务场景做出合理选型?本文对Kong、APISIX、Higress、Envoy Gateway、MAI Gateway等主流开源API网关进行横向评测,从性能、动态性、K8s集成度、AI流量治理等维度

weixin_34242819的博客 482

移植android ndk c++各种兼容性问题

__int64找不到符号 采用int64_t来代替: #if defined(__ANDROID__) typedef int64_t __int64; #endif 找不到 android下不需要直接引用该文件,用下面的宏去掉即可 #if !defined(__APPLE__) && !defined(__ANDROID__) #inc

阳光梦的专栏 3039

mysql笔记:23. 在Mac上安装与卸载MySQL

MySQL对Mac电脑的适配十分强大,再加上Mac本身就是Unix操作系统演化而来的,所以在Mac上安装MySQL的方式有多种。常见的方法有如下三种:DMG、brew、TAR。介绍这些方法前,我们先了解下MySQL安装文件的下载。

斌斌(Java) 2249

安卓NDK编程使用STL库及注意事项

NDK环境搭建 windows上搭建NDK开发环境:VS2013 + VisualGDB,参考链接:http://jingyan.baidu.com/article/a681b0de1a361c3b1843460c.html VS2013新建一个安卓项目,选择创建一个安卓动态库,然后就可以开始编写C\C++代码了。 添加STL支持 STL是C++开发最常用的一个库了,直接在程序中添

https://github.com/JelinYao 9271

华中科技大学 计算机组成原理 educoder Logisim平台 计算机数据表示实验

本文主要是对 计算机数据表示实验的笔记和相关Logisim平台的图,供大家学习交流使用。 需要源文件或者源代码,可以留言评论! 目录实验目的第1关:汉字国标码转区位码实验第2关:汉字机内码获取实验第3关:偶校验编码设计第4关:偶校验解码电路设计第5关:16位海明编码电路设计第6关:16位海明解码电路设计第7关:海明编码流水传输实验第8关:16位CRC并行编解码电路设计第9关:CRC编码流水传输实验实验结果: 实验目的 本实训将帮助同学们巩固对计算机中数据表示方法的理解,要求能设计汉字国标码与区位码之间的转换

weixin_48383580的博客 2万+

CH-x01&ICU-x0201-问答专题

CH201在近距离30cm和远距离1.8m左右测距误差是最大的,误差可能>3 cm。在中间部分测距误差是<2cm的,因为考虑到安装测试治具也存在误差,所以整个范围设置在±3cm。

nicole088的专栏 379

android stl,Android std和stl支持

By default,the headers and libraries for the minimal C++ runtime systemlibrary (/system/lib/libstdc++.so) are used when building C++ sources.You can however select a different implementation by settin...

weixin_36462094的博客 484

高通Camx功能feature分析之十:高通NCS服务之注册和启动

本文介绍了高通NCS(非相机传感器)服务的注册与启动流程。NCS通过QMI接口访问陀螺仪等传感器,为相机EIS/AEC等功能提供辅助数据。文章详细解析了服务注册时的QueryCapabilites能力查询、RegisterService注册流程,以及通过StartNCSService启动服务线程的过程。重点包括:1)AF/EIS等节点通过NCSService创建传感器对象;2)注册时需校验传感器类型和接口;3)首次注册成功后会启动NCS服务线程;4)采样率变化时需重新配置会话。通过线程池管理实现传感器数据的

1261

android-ndk开发(9): 深入解析NDK与Clang版本兼容性及编译问题排查

本文深入解析Android NDK与Clang编译器的版本兼容性问题,提供NDK与Clang版本对照表的查阅方法及常见编译错误的排查策略。针对因版本不匹配导致的符号缺失、ABI变更及C++标准库兼容性等问题,给出了系统化的解决方案和最佳实践建议,帮助开发者有效规避NDK开发中的编译陷阱。

pea55的博客 796

如何设置Xilinx以太网IP核的Pause帧处理

这里要注意,为什么是或,第一个条件是该功能使能取反,也就是说,如果你设置使能不打开的话,这个条件是直接满足的;先来看图中第二句,判断该以太网数据包为Global Pause帧(gpp),首先要满足Step1,然后是由上图中第二句代码(assign global_pause_packet)后面的所有项“与”(&&)起来的,就是说要满足后面所有的项,分别是DA符合,SA符合,Etype符合,Opcode符合,并且使能了该功能(即设置ctl_rx_enable_gpp=1)。如果没通过,则进入Step3。

qq_43416206的博客 618

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Android NDK APP_STL gnustl_shared is no longer supported 报错处理

错误原因:APP_STL gnustl_shared 不再被ndk支持。 由于 Android OS 放弃GCC转向了 Clang 编译器, 所以 NDK 将移除GCC, 所以建议用Clang编译你的程序。 修改 Applicaiton.mk 中的相关配置 1. APP_STL  := gnustl_static 改为 APP_STL := c++_static; 2.删除NDK_TOOLC...

智眸之音 2万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

从工具链革命看Android 16K适配:Clang/LLVM如何重塑NDK生态

本文探讨了Android系统向16KB内存页迁移过程中,Clang/LLVM工具链如何重塑NDK生态。通过分析内存页变革的挑战、NDK工具链演进历程及Clang/LLVM的技术优势,提供了IJKPlayer适配的实战案例和未来最佳实践,帮助开发者高效应对16K适配问题。

garlic的博客 689

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

GNU与c++STL的区别与联系

GNU与c++STL的区别与联系

whl0071的专栏 1797

C++学习(一九八)Android NDK中找不到gcc

在编译osg的Android库时遇到的问题。 使用的NDK版本为android-ndk-r19c,在android-ndk-r16b中能找到相关的gcc程序。 问题原因: ndk慢慢把clang作为主编译器,gcc将会被移除。 ndk16b的一个重要发布提示: GCC 不再受支持,虽然尚未从 NDK 中移除,但其已不再接收向后移植项。只有在 libc++ 足够稳定,可以成为默认 STL 之后,才能移除 GCC,因为 gnustl 的某些部分仍与 Clang 不兼容。当从 r18 中移除其他 STL

hankern的专栏 1662

AIDE_ndk_C++安装

AIDE和C++插件安装

anzhuoaaaanzhuo的博客 1万+

25 linux ndk 头文件_NDK官方开发指南翻译之 Toolchain

USING THE ANDROID TOOLCHAIN AS A STANDALONECOMPILER ===============================================================现在可以使用Android NDK提供的工具链作为独立的编译器。这会很有用,如果你已经有自己的编译系统,只需要调用交叉编译器,向Android添加支持即可。本文档解释了如...

weixin_35900383的博客 377

安卓 NDK 初学者指南第二版(五)

本章介绍了 NDK 的一个基本方面:可移植性。得益于构建工具链最近的改进,Android NDK 现在可以利用庞大的 C/C++生态系统。它开启了一个高效的生产环境,在这个环境中,代码可以与其他平台共享,旨在高效地创建新的尖端应用。更具体地说,你学会了如何在 NDK makefile 系统中通过一个简单的标志来激活 STL。我们将 Box2D 库移植成了一个可以在 Android 项目中重复使用的 NDK 模块。你也了解了如何使用原始的 NDK 工具链预构建 Boost,而不需要任何封装。

龙哥盟 1737

Android独立工具链 Androlua NDK 开发之路

您可以独立使用 Android NDK 附带的工具链,或将其作为插件与现有 IDE 结合使用。 如果您已有自己的构建系统,且仅需要调用交叉编译器功能以将对构建系统的支持添加到 Android,则这种灵活性非常有用。 一个典型用例是在CC环境变量中调用一个需要交叉编译器的开源库的 configure 脚本。 注:本页假设您非常了解编译、链接和低级架构。 此外,对于大多数用例来说本页介绍...

yangchuangbao的博客 829

NDK编译——独立工具链

文章的内容是从Android开发者官网扒的,为了防止再登不上去,记录一下。官网网址:https://developer.android.com/ndk/guides/standalone_toolchain.html 独立工具链 本页内容 选择您的工具链选择您的 Sysroot调用编译器使用 ClangABI 兼容性警告和限制 您

suningning的专栏 7909

C++ 项目编译器选择与跨平台指南

C++跨平台开发编译器选择指南 本文系统分析了C++项目在不同平台下的编译器选择策略,涵盖GCC、Clang、MSVC和Emscripten四大主流工具链。重点内容包括: 编译器与标准库对应关系,强调避免混用libstdc++和libc++ GCC与Clang的对比选择:GCC适合Linux/嵌入式,Clang更适合跨平台和新标准

REDcker的博客 947

提取安卓NDK中的交叉编译器

参考国内镜像网站文档:使用独立工具链:https://developer.android.google.cn/ndk/guides/standalone_toolchain?hl=zh 大体步骤如下: 1. 调用ndk-bundle/build/tools/make_standalone_toolchain.py,生成一个压缩包。 2. 写一个批处理文件:设置一些环境变量,以后每次编译,直接...

lizhengx的专栏 4041
上一篇: 进程工作目录设置不当导致的设备持续被占用的问题
Azure小诶
博客等级 码龄15年 18粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值