【发布时间】:2016-11-23 11:59:20
【问题描述】:
我正在尝试为 arm-v8 交叉编译 fdk-aac。
这是我的构建脚本:
#!/bin/sh
NDK_HOME=/home/ubuntu/android-ndk-r12b
INSTALL_DIR=/home/ubuntu/compiled
SYSROOT=$NDK_HOME/platforms/android-16/arch-arm/
TOOLCHAIN=$NDK_HOME/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
CC={$CROSS_PREFIX}gcc
CXX={$CROSS_PREFIX}g++
CPP={$CROSS_PREFIX}cpp
CXXCPP={$CROSS_PREFIX}cpp
./configure \
--prefix=$INSTALL_DIR \
--with-sysroot=$SYSROOT \
--host=aarch64 \
--enable-shared \
--with-pic=no \
CC="${CROSS_PREFIX}gcc --sysroot=$SYSROOT" \
CXX="${CROSS_PREFIX}g++ --sysroot=$SYSROOT" \
RANLIB="${CROSS_PREFIX}ranlib" \
AR="${CROSS_PREFIX}ar" \
STRIP="${CROSS_PREFIX}strip" \
NM="${CROSS_PREFIX}nm" \
LD="${CROSS_PREFIX}ld --sysroot=$SYSROOT" \
CFLAGS="-O2 $OPTIMIZE_CFLAGS --sysroot=$SYSROOT" \
CXXFLAGS="-O2 $OPTIMIZE_CFLAGS --sysroot=$SYSROOT"
#make
#make install
make 和make install 没用,因为./configure 失败并且错误信息要求我检查config.log:
configure:3243: checking whether the C compiler works
configure:3265: /home/ubuntu/android-ndk-r12b/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-gcc --sysroot=/home/ubuntu/android-ndk-r12b/platforms/android-16/arch-arm/ -O2 --sysroot=/home/ubuntu/android-ndk-r12b/platforms/android-16/arch-arm/ conftest.c >&5
/home/ubuntu/android-ndk-r12b/platforms/android-16/arch-arm/usr/lib/crtbegin_dynamic.o: error adding symbols: File in wrong format
collect2: error: ld returned 1 exit status
configure:3269: $? = 1
configure:3307: result: no
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME "fdk-aac"
| #define PACKAGE_TARNAME "fdk-aac"
| #define PACKAGE_VERSION "0.1.4"
| #define PACKAGE_STRING "fdk-aac 0.1.4"
| #define PACKAGE_BUGREPORT "http://sourceforge.net/projects/opencore-amr/"
| #define PACKAGE_URL ""
| #define PACKAGE "fdk-aac"
| #define VERSION "0.1.4"
| /* end confdefs.h. */
|
| int
| main ()
| {
|
| ;
| return 0;
| }
configure:3312: error: in `/home/ubuntu/fdk-aac-0.1.4':
configure:3314: error: C compiler cannot create executables
我不知道构建脚本的哪个配置错误。这是我第一次为 ARM64 交叉编译库...
【问题讨论】:
-
“arch-arm”肯定是 64 位的 sysroot,而不是 32 位的吗?
-
@Notlikethat,arch-arm 是一个 32 位平台。在我的 NDK 副本中,我没有在 android-16 下看到 arch-arm64,但对于 API 级别 21+,该平台确实存在。
-
可以肯定的是,您可以使用 readelf/objdump/etc 检查
crtbegin_dynamic.o的标题。 - 如果是 32 位 ARM 代码,则需要 32 位 ARM 工具链。请注意,如今 64 位机器运行 64 位内核但运行 32 位用户空间的情况并不少见,尤其是在 Android 中(为了兼容性,所有 32 位的东西无论如何都必须在那里,并且必须有 64 -bit 版本会占用大量空间)。
标签: android cross-compiling arm64