LLVM怎么通过Android NDK交叉编译原生库

陌强大大_9813

陌强大大_9813

2026-10-01

486人浏览

原创

ndk r19+ 的 llvm 工具链位于 $ndk/toolchains/llvm/prebuilt//bin/,如 linux-x86_64 或 windows-x86_64 目录下;关键可执行文件为带 abi 和 api level 后缀的 clang(如 aarch64-linux-android21-clang),它们是自动配置 target/sysroot 的 wrapper。

llvm怎么通过android ndk交叉编译原生库

NDK r19+ 的 LLVM 工具链在哪

NDK r19 起,LLVM/Clang 是唯一支持的编译器,GCC 已被彻底移除。工具链不再按 ABI 分目录存放,而是统一放在 $NDK/toolchains/llvm/prebuilt/<host>/bin/</host> 下,比如 linux-x86_64 或 windows-x86_64。

关键不是找“LLVM”,而是找带 ABI 和 API level 后缀的 clang 可执行文件:

  • aarch64-linux-android21-clang:编译 arm64-v8a,最低 Android 21
  • armv7a-linux-androideabi21-clang:编译 armeabi-v7a,注意命名中是 androideabi,不是 android
  • i686-linux-android21-clang:x86
  • x86_64-linux-android21-clang:x86_64

这些命令本质是 clang 的 wrapper,自动设置了 --target、--sysroot 和链接路径。手动指定 --sysroot 在 r19+ 通常不必要,反而容易覆盖默认行为。

configure 脚本里怎么传 --host 和 CC

如果你用 autotools(如 FFmpeg、LAME、Erlang),./configure 必须明确告诉构建系统目标平台和编译器。典型写法:

./configure \
  --host=aarch64-linux-android21 \
  --prefix=$PREFIX \
  CC=$TOOLCHAIN/bin/aarch64-linux-android21-clang \
  CXX=$TOOLCHAIN/bin/aarch64-linux-android21-clang++ \
  AR=$TOOLCHAIN/bin/llvm-ar \
  RANLIB=$TOOLCHAIN/bin/llvm-ranlib \
  STRIP=$TOOLCHAIN/bin/aarch64-linux-android21-strip \
  CFLAGS="-fPIC -O2" \
  LDFLAGS="-fPIC"

注意三点:

Android Adb Skill
Android Adb Skill

Android 开发调试技能,通过系统 ADB 工具操作 Android 设备。以下场景必须触发此技能:(1) 直接 ADB 操作——安装 APK、查看设备列表、抓取 logcat 日志、查看已安装应用、清除应用数据、截图、重启设备、拉取/推送文件、查看 CPU/内存/电池信息、adb shell 操作;(2)...

下载
  • --host 值必须与编译器前缀一致(如 aarch64-linux-android21),不能写成 aarch64-linux-android(缺 API level)
  • AR 和 RANLIB 必须用 llvm-ar/llvm-ranlib,NDK 不再提供 GNU binutils
  • CFLAGS 中 -fPIC 对动态库是强制的;静态库虽非强制,但建议加上,避免后续链接时出错

Android.mk / CMakeLists.txt 怎么避开硬编码路径

在 Android Studio 项目中,不要在 Android.mk 或 CMakeLists.txt 里写死 NDK 路径或工具链路径。正确做法是依赖 CMake 自带的 Android toolchain:

  • CMake 构建时传入:-DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake
  • 然后只控制 ABI 和 platform:-DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=android-21
  • CMAKE_TOOLCHAIN_FILE 内部已封装好所有 clang 调用、sysroot、链接器参数,你只需专注源码逻辑

常见错误:自己在 CMakeLists.txt 里用 set(CMAKE_C_COMPILER ".../aarch64-linux-android21-clang") —— 这会绕过 NDK 的 ABI/platform 校验,导致生成的 so 缺少 ANDROID_API 符号或链接失败。

为什么 clang 报 “undefined reference to ‘__cxa_atexit’”

这是典型的 C++ 运行时链接缺失,尤其在静态链接 libc++ 时容易出现。根本原因是:NDK 默认不链接 libc++_static.a 的完整符号集,而 __cxa_atexit 属于 C++ ABI 初始化部分。

解决方式分场景:

  • 用 libc++_shared.so(推荐):确保 -DANDROID_STL=c++_shared,并在 APK 中打包该 so;运行时由系统加载
  • 强行静态链接:加 -lc++abi -latomic,且顺序不能错:-lc++_static -lc++abi -latomic -lm -lc -llog
  • 纯 C 项目却用了 .cpp 扩展名:改后缀为 .c,或显式用 clang(而非 clang++)编译,避免触发 C++ runtime 链接

这个错误不会在编译阶段报出,往往卡在 ld 阶段末尾,容易误判为源码问题。实际是链接器找不到 C++ ABI 支撑函数 —— 它不在你写的代码里,而在 NDK 提供的运行时库里。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
android开发三大框架
android开发三大框架

android开发三大框架是XUtil框架、volley框架、ImageLoader框架。本专题为大家提供android开发三大框架相关的各种文章、以及下载和课程。

2023.08.14

882

4

android是什么系统
android是什么系统

Android是一种功能强大、灵活可定制、应用丰富、多任务处理能力强、兼容性好、网络连接能力强的操作系统。本专题为大家提供android相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.22

2547

5

android权限限制怎么解开
android权限限制怎么解开

android权限限制可以使用Root权限、第三方权限管理应用程序、ADB命令和Xposed框架解开。详细介绍:1、Root权限,通过获取Root权限,用户可以解锁所有权限,并对系统进行自定义和修改;2、第三方权限管理应用程序,用户可以轻松地控制和管理应用程序的权限;3、ADB命令,用户可以在设备上执行各种操作,包括解锁权限;4、Xposed框架,用户可以在不修改系统文件的情况下修改应用程序的行为和权限。

2023.09.19

4737

7

android重启应用的方法有哪些
android重启应用的方法有哪些

android重启应用有通过Intent、PendingIntent、系统服务、Runtime等方法。本专题为大家提供Android相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

605

5

Android语音播放功能实现方法
Android语音播放功能实现方法

实现方法有使用MediaPlayer实现、使用SoundPool实现两种。可以根据具体的需求选择适合的方法进行实现。想了解更多语音播放的相关内容,可以阅读本专题下面的文章。

2024.03.01

924

5

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

20

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

40

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

20

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

20

26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 43.8万人学习

Java 教程
Java 教程

共578课时 | 188.8万人学习