Libgmp x86_64架构NDK编译:辅助二进制无法运行问题求助
你的问题本质是交叉编译时辅助工具的架构不兼容:你用NDK的x86_64-android工具链编译了gen-fib这类辅助程序,它们是Android x86_64架构的二进制,无法直接在Ubuntu x86_64主机上运行(Android和Linux的用户空间二进制存在系统调用、动态链接库等差异,且QEMU通常不自动模拟同架构的Android二进制)。而arm64/x86能成功,大概率是Ubuntu默认安装的qemu-user-static帮你模拟了这些异架构的二进制,但x86_64 Android和x86_64 Linux的差异无法被QEMU自动处理。
下面是具体的解决方案:
核心思路
交叉编译时,需要区分主机工具链(用来编译能在Ubuntu上运行的辅助工具)和目标工具链(用来编译Android平台的GMP库)。通过明确指定HOSTCC/HOSTCXX为主机编译器,让configure用主机工具链生成辅助程序,再用NDK工具链编译GMP本身。
修正后的操作步骤
1. 重新生成独立工具链(和你之前的步骤一致)
$NDK/build/tools/make_standalone_toolchain.py --arch "x86_64" --api 27 \ --stl=libc++ --install-dir /tmp/android-toolchain --force
2. 正确设置环境变量
注意区分目标编译器和主机编译器:
# 目标工具链路径 export PREBUILT=/tmp/android-toolchain export CROSS_COMPILE=${PREBUILT}/bin/x86_64-linux-android- # 目标平台编译器(NDK提供) export CC=${CROSS_COMPILE}clang export CXX=${CROSS_COMPILE}clang++ export AR=${CROSS_COMPILE}ar export RANLIB=${CROSS_COMPILE}ranlib export STRIP=${CROSS_COMPILE}strip export LD=${CROSS_COMPILE}ld # 主机编译器(Ubuntu系统自带的gcc/clang,用来编译辅助工具) export HOSTCC=gcc export HOSTCXX=g++ # 目标平台的编译/链接参数 export CFLAGS="-isystem ${PREBUILT}/sysroot/usr/include/x86_64-linux-android -D__ANDROID_API__=27 -I${PREFIX}/include" export CPPFLAGS="${CFLAGS}" export CXXFLAGS="${CFLAGS}" export LDFLAGS="-Wl,-rpath-link=${PREBUILT}/sysroot/usr/lib/x86_64-linux-android -L${PREBUILT}/sysroot/usr/lib/x86_64-linux-android -lc -lm -ldl -llog -lgcc -L${PREFIX}/lib"
注意:修正了你之前
LDFLAGS里的路径笔误($/tmp改为正确的变量引用),同时指定了NDK sysroot下正确的x86_64库路径。
3. 执行configure命令
确保--host设置为正确的Android目标架构,--build可以明确指定主机架构(或省略,configure会自动检测):
./configure --prefix=${PREFIX} \ --host=x86_64-linux-android \ --build=x86_64-unknown-linux-gnu \ --disable-dependency-tracking \ --enable-static \ --disable-shared \ || exit 1
4. 编译安装
make -j4 || exit 1 make install || exit 1
验证
执行make时,你会看到gen-fib这类辅助程序是用HOSTCC(系统gcc)编译的,生成的是Ubuntu x86_64架构的二进制,能正常运行并生成fib_table.h等所需文件,后续GMP库的编译也会顺利完成。
内容的提问来源于stack exchange,提问作者user654628

