移动端交叉编译(二)
MSYS2 下工具编译
在 MSYS2 环境中安装 automake、autoconf、libtool 等构建工具非常简单,因为 MSYS2 提供了 pacman 包管理器来管理软件包。以下是具体步骤:
1. 更新 MSYS2 包数据库
打开 MSYS2 终端(根据你的需求选择对应的终端环境,例如 MSYS2 MinGW 64-bit 或 MSYS2 MSYS),然后运行:
bash
复制
pacman -Syu
如果提示关闭终端,重启终端后再次运行更新,直到系统完全更新:
bash
复制
pacman -Su
2. 安装 automake、autoconf、libtool
在终端中执行以下命令:
bash
复制
pacman -S --needed autoconf automake libtool
--needed参数表示仅安装未安装的包,避免重复下载。
3. 验证安装
安装完成后,检查工具版本以确保安装成功:
bash
复制
autoreconf --version # 查看 autoconf 和 automake 版本
libtool --version # 查看 libtool 版本
4. 安装其他依赖(可选)
- Perl:某些脚本需要 Perl 环境(如
autoconf的宏处理):bash复制pacman -S perl - GCC 和 Make:如果尚未安装编译工具链:
bash复制
pacman -S mingw-w64-x86_64-toolchain # MinGW 64位工具链 pacman -S make # Make 工具
5. 注意终端环境选择
- 编译 Windows 原生程序(如生成
.exe):
使用MSYS2 MinGW 64-bit或MSYS2 MinGW 32-bit终端。 - 编译 MSYS2 环境下的工具(如 Unix 风格软件):
使用MSYS2 MSYS终端。
6. 示例:生成 configure 文件
假设你正在编译一个需要生成 configure 的源码库(如 MPFR):
bash
复制
cd /path/to/mpfr-source
autoreconf -ivf # 生成 configure 脚本
./configure # 配置编译选项
make # 编译
常见问题
-
错误:
pacman: command not found
确保你使用的是 MSYS2 终端,而不是原生的 Windows 命令提示符(CMD/PowerShell)。 -
错误:
automake: command not found
检查是否安装成功,或尝试重启终端。 -
GMP 依赖问题
如果编译 MPFR 时提示缺少 GMP 库,需额外安装:bash复制pacman -S mingw-w64-x86_64-gmp # MinGW 64位的GMP库
通过以上步骤,你应该能在 MSYS2 环境中成功安装自动化构建工具,并解决 configure 文件缺失的问题。
在只有Makefile的zstd源码目录下进行安卓arm64-v8a的编译,可以按照以下步骤操作:
1. 安装Android NDK
- 下载并解压 Android NDK(推荐r25及以上版本)。
- 设置环境变量:
bash复制
export NDK_HOME=/path/to/your/ndk
2. 生成独立工具链(可选)
使用NDK生成针对arm64-v8a的独立工具链:
bash
复制
$NDK_HOME/build/tools/make-standalone-toolchain.sh \
--arch=arm64 \
--api=21 \
--install-dir=/tmp/ndk-arm64
将生成的工具链路径加入环境变量:
bash
复制
export PATH=/tmp/ndk-arm64/bin:$PATH
3. 配置编译参数
进入zstd源码目录,执行以下命令:
bash
复制
make CC=aarch64-linux-android-clang \
CXX=aarch64-linux-android-clang++ \
AR=aarch64-linux-android-ar \
STRIP=aarch64-linux-android-strip \
CFLAGS="-O3 -fPIE -fPIC -D__ANDROID_API__=21" \
LDFLAGS="-pie"
参数说明
-
CC/CXX: 指定交叉编译的Clang编译器。 -
AR/STRIP: 指定工具链中的ar和strip程序。 -
CFLAGS:-O3: 启用优化。-fPIE -fPIC: 生成位置无关代码(兼容Android PIE安全机制)。-D__ANDROID_API__=21: 指定最低API级别(Android 5.0+)。
-
LDFLAGS="-pie": 生成符合Android要求的可执行文件。
4. 直接使用NDK Clang(替代方案)
如果未生成独立工具链,直接使用NDK内置Clang:
bash
复制
make CC="$NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang" \
CXX="$NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang++" \
AR="$NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar" \
STRIP="$NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip" \
CFLAGS="-O3 -fPIE -fPIC" \
LDFLAGS="-pie"
5. 验证输出
编译完成后,检查生成的二进制文件:
bash
复制
file zstd
输出应包含 aarch64 和 Android 字样,例如:
zstd: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, ..., for Android 21, stripped
6. 问题排查
- 头文件/库缺失:检查
CFLAGS是否包含正确的sysroot路径(如需手动指定,添加--sysroot=$NDK_HOME/toolchains/.../sysroot)。 - 链接错误:确认
AR和STRIP指向正确的工具链程序。 - API不兼容:调整
-D__ANDROID_API__的值(如29对应Android 10)。
通过以上步骤,即可在仅有Makefile的zstd源码中完成安卓arm64-v8a的编译。

浙公网安备 33010602011771号