使用x86_64

时间:2018-01-30 09:45:50

标签: android linux android-ndk cross-compiling gmp

我正在尝试使用NDK构建libgmp作为静态(共享也不起作用),我需要这个与nettle和gnutls链接。我在下面使用的版本:

  • GMP:6.1.2
  • NDK:r16b
  • 目标:x86_64
  • API:android-27
  • 环境:Ubuntu 16.04(Windows shell)

所以我从他们的网站下载了libgmp的tar,然后是android standalong工具链:

$NDK/build/tools/make_standalone_toolchain.py --arch "x86_64" --api 27 \
     --stl=libc++ --install-dir /tmp/android-toolchain --force

设置要与NDK链接的环境

     # Prefix is out the output folder location
     PREBUILT=/tmp/android-toolchain
     CROSS_COMPILE=$PREBUILT/bin/x86_64-
     CFLAGS="-isystem /tmp/android-toolchain/sysroot/usr/include/x86_64/ -D__ANDROID_API__=27-I$PREFIX/include"

    export LDFLAGS="-Wl,-rpath-link=/tmp/android-toolchain/sysroot/usr/lib -L$/tmp/android-toolchain/sysroot/usr/lib -lc -lm -ldl -llog -nostdlib -lgcc -L$PREFIX/lib"
    export CPPFLAGS="$CFLAGS"
    export CFLAGS="$CFLAGS"
    export CXXFLAGS="$CFLAGS"
    export CXX="clang++"
    export AS="clang"
    export CC="clang" 
    export NM="${CROSS_COMPILE}nm"
    export STRIP="${CROSS_COMPILE}strip"
    export RANLIB="${CROSS_COMPILE}ranlib"
    export AR="${CROSS_COMPILE}ar"
    export LD="${CROSS_COMPILE}ld"

然后运行configure

./configure 
    --prefix=$PREFIX \
    --host="x86_64-linux" \
    --build=x86_64-unknown-linux-gnu \
    --disable-dependency-tracking \
    --enable-static \
    --disable-shared \
    || exit 1

 make -j4 || exit 1

前缀指向输出目录,(也尝试过主机x86_64-linux-android)。它配置,但之后运行make时,它会尝试编译一堆二进制文件,自动创建一堆文件,如 gen-fib.c - > gen-fib 二进制。

Makefile然后运行该二进制文件以创建头文件( fib_table.h )和源fib_table.c。当Makefile运行时(我相信类似的东西)

gen-fib header <number> <number> > fib_table.h

它不输出任何内容,因此 fib_table.h 为空(0字节)。我试图从命令行运行它,没有任何东西出现。试图在 gen-fib.c 中创建一个文件,并将其编译为创建一个虚拟文件,但没有任何反应。二进制文件什么都不执行,根本不运行!

现在我已经使用arm64(aarch64或arm64-v8a)和x86(当然在不同主机之间运行 make distclean )成功编译了这个。我试图将config.log与x86和x86_64进行比较,唯一的区别是configure和x86 android工具链中的host参数。对于我的x86_64日志文件,你可以在这里阅读: https://pastebin.com/LLEbDz11

如果有人知道为什么二进制文件(比如gen-fibs)在为x86_64编译后没有运行(但是其他abi如x86和arm64)请告诉我。

提前致谢!!

1 个答案:

答案 0 :(得分:0)

我发现二进制文件没有构建,因为它正在使用工具链的铿锵声。使用

 export CC_FOR_BUILD=/usr/bin/gcc

使用linux中的gcc正确编译。