无CMakeLists.txt时如何在Windows上为Android交叉编译C++项目
Windows平台交叉编译Autotools类Android C++项目的实用方案
针对需要走./configure + make流程的C++开源项目,不用强行手写CMakeLists.txt移植,Windows下有成熟的低门槛交叉编译方案,按易用度排序如下:
- 最稳妥的基础方案:Android NDK官方工具链 + MSYS2环境
这套组合不需要装完整Linux虚拟机,配置步骤非常固定,踩坑成本极低:- 提前安装好Android NDK(建议选r25及以上的稳定版本,默认随Android Studio安装即可,记住本地NDK的根目录路径),NDK已经内置了全ABI适配的clang编译器、sysroot、C++标准库,不需要自己从零编译交叉编译工具链。
- 安装MSYS2,打开MSYS2的MINGW64终端,把你要编译的目标ABI对应的NDK工具链bin目录加到PATH最靠前的位置。比如你要编arm64-v8a架构的产物,NDK版本是25.2.9519653、装在C盘Android SDK目录下的话,对应路径就是
C:\Android\Sdk\ndk\25.2.9519653\toolchains\llvm\prebuilt\windows-x86_64\bin。 - 进入项目源码根目录,执行
./configure时指定正确的交叉编译参数:比如arm64-v8a传--host=aarch64-linux-android,显式指定CC=clang、CXX=clang++,其他功能裁剪参数按你自己的需求加就行。如果有前置依赖库,记得提前用同套工具链编好依赖,通过CPPFLAGS、LDFLAGS把依赖的头文件、库路径传给configure。 - configure执行无报错后,直接跑
make -j$(nproc)就能生成对应架构的可执行文件、静态/动态库,产物可以直接推到Android设备控制台环境运行。
- 省时间的懒人方案:用开源的交叉编译封装脚本
如果你不想记一堆host参数、环境变量配置规则,可以直接用成熟的开源交叉编译封装脚本,这类脚本会自动扫描本地NDK路径,自动补全所有编译参数,你只需要选好目标ABI、指定源码目录,等脚本执行完就能直接拿产物。很多常用的Autotools类开源项目(包括你提到的libheif)的代码仓库里,都有社区贡献好的Android编译参考脚本,改下本地路径就能直接用,不用自己从零写配置。 - 几个高频踩坑点提前说明:
- 别用Cygwin环境跑编译流程,Cygwin会默认给二进制加自身的兼容层依赖,编出来的产物没法在Android原生环境运行。
- 全程保证所有编译用到的依赖、编译器都来自同一个NDK工具链,不要混用MSYS2自带的gcc、Windows本地的头文件或者库文件,不然会出各种架构不兼容、符号找不到的错误。
- r25及以上版本的NDK不需要手动指定sysroot路径,工具链会自动定位,用老版本NDK的话需要额外传sysroot参数,平白多很多配置步骤,没必要。
内容的提问来源于stack exchange,提问作者tumuyan
相关产品推荐
相关产品推荐

