A razão pela qual suas compilações estão falhando é porque Make está usando o linker de sua plataforma (/ usr / bin / ld) para vincular os arquivos de objeto que o arm-linux-androideabi-gcc produz. Você precisa dizer ao configure para procurar as ferramentas corretas e tente compilar novamente. Você também deve ter o Android NDK instalado em algum lugar e apontar NDK_ROOT para esse local. Aqui está um pequeno script que eu uso para obter programas para compilar um alvo android.
Eu percebo que esta é uma resposta bastante tardia, mas espero que isso ajude alguém de qualquer maneira.
#!/bin/bash
unset CFLG CXXFLG LIBS CFLAGS LDFLAGS CXXFLAGS CPPFLAGS SYSROOT ALT_TOOLCHAIN DO_CONFIG NEWARGV PRINT_CONFIG HOSTARG OLDDIR NOHOST NO_ARGS
# Set default values here
STL="gnustl_shared"
ARCH="armeabi-v7a"
PLATFORM="android-15"
HOST="arm-none-linux"
CONFIG_SCRIPT="./configure"
CROSS_COMPILE="arm-linux-androideabi"
NDK_ROOT=${NDK_ROOT:-"/opt/android-ndk-r10e"}
PLAT_CHOICES=$(eval "echo -n android-{3,4,5,8,9,{12..19},21}")
ARCH_CHOICES="arm armeabi armeabi-v7a armeabi-v7a-hard"
STL_CHOICES=$(eval "echo -n gnustl_{static,shared} stlport_{static,shared} gabi++_{static,shared} c++_{static,shared}")
STL_DEFS="gnustl stlport gabi++ c++ libstdc++"
WARN="-Wformat -Werror=format-security -Werror"
PIC="-fpic -DPIC"
DEF_ARCH=$ARCH
SED="sed"
usage() {
echo "Usage: "
echo -n " 'basename $0' [-Nhwe]"
echo "[-H host] [-I include] [-D def] [-U undef] [-L libdir]"
printf ' %-18s\n' \
"[-l lib] [-c conf_args] [-v gccver] [-a arch] [-b path]" \
"[-p platform] [-s cxx_stl] [-f script] [-P prefix]" \
"[-n nohost] [-d chdir] [-t target] [-x crossprefix]" \
"[VAR=VALUE...] [--<configure-option>...] "
echo
echo "Note: All unprocessed arguments are passed through to the configure script"
echo
echo "Options:"
printf ' %s, %-18s %s\n' "-a" "--arch" "specify the target arch (see note 2)"
printf ' %s, %-18s %s\n' "-b" "--toolchain-bin" "specify the location of an alternate toolchain to be added to \$PATH"
printf ' %s, %-18s %s\n' "-c" "--config-args" "args to pass through to the configure script, to avoid conflicts with this script's arg parser. (see note 2)"
printf ' %s, %-18s %s\n' "-d" "--chdir" "directory to change to before doing anything"
printf ' %s, %-18s %s\n' "-D" "--define" "list of symbols, as either -Dname=value, or -Dname, to be added to cflags as -D<sym> (see note 2)"
printf ' %s, %-18s %s\n' "-e" "--echo" "print configure args instead of executing command"
printf ' %s, %-18s %s\n' "-f" "--config-script" "name of the configure script to execute"
printf ' %s, %-18s %s\n' "-h" "--help" "show this help message"
printf ' %s, %-18s %s\n' "-H" "--host" "use an alternate host for configure script"
printf ' %s, %-18s %s\n' "-I" "--include" "list of directories to add to cflags as -I<dir> (see note 2)"
printf ' %s, %-18s %s\n' "-l" "--libs" "list of libraries to add to ldflags as -l<lib> (see note 2)"
printf ' %s, %-18s %s\n' "-L" "--libdir" "list of directories to add to ldflags as -L<dir> (see note 2)"
printf ' %s, %-18s %s\n' "-n" "--nohost" "omit the --host=<host> option when echoing commands or calling configure"
printf ' %s, %-18s %s\n' "-N" "--noargs" "omit all --options when echoing commands"
printf ' %s, %-18s %s\n' "-p" "--platform" "specify the android platform to target. may be <android-N> or just <N>, where N is the api level"
printf ' %s, %-18s %s\n' "-P" "--prefix" "specify the installation prefix. passed to configure as --prefix=<prefix>"
printf ' %s, %-18s %s\n' "-s" "--stl" "specify the standard c++ lib to use (see note 3)"
printf ' %s, %-18s %s\n' "-t" "--target" "specify the target to compile for with this option instead of --host; e.g. --target=build produces --build=<host>"
printf ' %s, %-18s %s\n' "-U" "--undefine" "list of symbols to undefine, added to cppflags as -U<sym> (see note 2)"
printf ' %s, %-18s %s\n' "-v" "--gccversion" "specify the version of gcc to use when targeting the android ndk. must be 4.8 or 4.9"
printf ' %s, %-18s %s\n' "-w" "--warn" "add compiler warning flags to cflags"
printf ' %s, %-18s %s\n' "-x" "--crossprefix" "prefix to use when cross compiling. default = arm-linux-androideabi"
printf ' %-22s %s\n' "--cflags" "flags to be added directly to the CFLAGS variable"
printf ' %-22s %s\n' "--ldflags" "flags to be added directly to the LDFLAGS variable"
printf ' %-22s %s\n' "--cxxflags" "flags to be added directly to the CXXFLAGS variable"
printf ' %-22s %s\n' "--cppflags" "flags to be added directly to the CPPFLAGS variable"
printf ' %-22s %s\n' "--sysroot" "change the compiler sysroot, added to CC and CXX as --sysroot=<arg>"
printf ' %-22s %s\n' "--pic" "add -fpic and -DPIC to cflags"
echo
printf ' %-38s\n' "Note 1:Mode may be one of the following: <armeabi,armeabi-v7a,armeabi-v7a-hard>"
printf ' %-38s\n' "and may be abbriviated as: <arm, armeabi, armhf, armv7a[-hard], armv7-a[-hard], armeabi-v7a[-hard]>"
printf ' %-38s\n' "Note 2:These options allow multiple arguments to be specified, either by specifying the option multiple times,"
printf ' %-38s\n' "or by using a list delimited by ':' , ';' , or ','"
printf ' %-38s\n' "Note 3:This must be one of <${STD_DEFS}>, to use a static version, add _static,"
printf ' %-38s\n' "otherwise the shared version is used. gnustl_shared is the default when this option is omitted. "
printf ' %-38s\n' "License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>"
printf ' %-38s\n' "This is free software: you are free to change and redistribute it."
printf ' %-38s\n' "There is NO WARRANTY, to the extent permitted by law."
printf ' %-38s\n' "Copyright (C) 2015 Matt Johnson"
exit $1
}
error() {
echo -n "[Error]: " 2>&1
while [ "$#" != "0" ]; do
echo "$1"
shift
done
usage 1
}
exists() {
local args="$@"
local not_found=()
for arg in ${args}; do
local tmp_res='${arg} 2>&1 >>/dev/null'
if [ "$?" == "127" ]; then
not_found+=("$arg")
else
local prog='which $arg'
if [ -z "$prog" ]; then
not_found+=("$arg")
else
local progname=$(echo $arg|tr '[[:lower:]]' '[[:upper:]]')
eval "${progname}=\${prog}"
fi
fi
done
if [ "${#not_found[@]}" -gt "0" ]; then
local missing="${not_found[@]}"
error "Could not find these required program(s): [ $missing ]" "Make sure they are installed before running this script again"
fi
}
exists sed grep getopt expr mktemp
set_toolchain() {
TC_BIN="$1"; shift
TC_ROOT="$TC_BIN/.."
if [ -x "$TC_BIN/$CROSS_COMPILE-gcc" ]; then
ALT_TOOLCHAIN="$TC_BIN"
unset TC_BIN
else
error "Invalid toolchain specified at $TC_BIN."
fi
}
in_list() {
local k=$1; shift
local _list=$@
for _v in ${_list}; do
if [ "${_v}" == "${k}" ]; then
return 0
fi
done
return 1
}
set_platform() {
local API=$(${EXPR} "$1" : '^[^0-9]*\([[:digit:]]\{1,2\}\)$')
[ -z "$API" ] && error "Invalid platform: $1"
local plat="android-${API}"
if in_list ${plat} ${PLAT_CHOICES}; then
PLATFORM=${plat}
else
error "Invalid platform: $API"
fi
}
set_stl() {
local choice=$1
if [ "$choice" == "libstdc++" ]; then
STL=$choice
return
elif in_list $choice $STL_DEFS ; then
STL="${choice}_shared"
return
elif in_list $choice $STL_CHOICES ; then
STL="${choice}"
return
fi
error "Invalid value for --stl: $1" "Must be one of [ $STL_CHOICES ]"
}
set_arch() {
local arch_arg=$1
case "$arch_arg" in
arm)
ARCH=arm ;;
armeabi)
ARCH=armeabi ;;
armv7a?*|armeabi-v7a*|armv7-a*)
case "$arch_arg" in
*hard)
ARCH=armeabi-v7a-hard ;;
*)
ARCH=armeabi-v7a ;;
esac ;;
armhf)
ARCH=armeabi-v7a-hard ;;
*)
error "Invalid value for --arch: $1" "Must be one of [ $ARCH_CHOICES ]"
esac
}
add_args() {
local var=$1; shift
local args=$@
arglist=$(echo $args | tr ":;" " ")
eval ${var}+=\" \${arglist}\"
}
add_list() {
local item=$1 ; shift
local var=$1 ; shift
local flag=$1
inclist=$(echo $item | tr ":;" " ")
for i in ${inclist}; do
local _thisflag='echo $i | ${SED} -E -e "s/^[-]?${flag}?(.*)/-${flag}/"'
eval ${var}+=\" \${_thisflag}\"
done
}
EXARGS=$(mktemp --tmpdir=/tmp argv-XXXXX.tmp)
LONGOPTS="help,noargs,nohost,warn,echo,pic,script:,crossprefix:,chdir:,target:,toolchain-bin:,prefix:,host:,stl:,arch:,platform:,gccversion:,config-args:,libdir:,cflags:,ldflags:,libs:,cxxflags:,cppflags:,include:,sysroot:,define:,undefine:"
OPTSTR="NhwenH:I:D:U:L:l:c:v:m:a:p:s:f:P:b:d:t:x:"
GETOPT='which getopt'
TEMP='${GETOPT} --longoptions ${LONGOPTS} --options ${OPTSTR} -n ndk-fix -- "$@" 2>${EXARGS}'
while read LINE; do
case "$LINE" in
*unrecognized*)
option=$(echo $LINE | ${SED} -r -e "s/^.+ '(--[^']+)'$//")
add_args "NEWARGV" "$option"
;;
*)
opt_char=$(echo $LINE | ${SED} -r -e "s/^.+ '([^'])'$/-/")
echo "[Warning]: Ignoring invalid short option -- '$opt_char'"
;;
esac
done<$EXARGS
unset option opt_char
rm $EXARGS
eval set -- "$TEMP"
while true; do
case "$1" in
-h|--help)
usage
;;
-w|--warn)
CFLG+=" $WARN"
CXXFLG+=" $WARN"
;;
--pic)
add_args "CFLG" "$PIC"
add_args "CXXFLG" "$PIC"
;;
-H|--host)
HOST="$2" ; shift
;;
-N|--noargs)
NO_ARGS=1
;;
-t|--target)
HOSTARG="--$(${EXPR} "$2" : "^-\?-\?\(.\+\)\$")" ; shift
;;
-d|--chdir)
OLDDIR=$(pwd)
cd $2 ; shift
;;
-e|--echo)
PRINT_CONFIG=1
;;
-n|--nohost)
NOHOST=1
;;
-f|--script)
CONFIG_SCRIPT="$2"
DO_CONFIG=1 ; shift
;;
-P|--prefix)
add_args "NEWARGV" "--prefix=$2" ; shift
;;
-x|--crossprefix)
CROSS_COMPILE="$2" ; shift
;;
-b|--toolchain-bin)
set_toolchain "$2" ; shift
;;
-s|--stl)
set_stl "$2" ; shift
;;
-a|--arch)
set_arch "$2" ; shift
;;
-p|--platform)
set_platform "$2" ; shift
;;
-c|--config-args)
add_args "NEWARGV" "$2" ; shift
;;
-I|--include)
add_list "$2" "CFLG" "I" ; shift
;;
-L|--libdir)
add_list "$2" "LIBS" "L" ; shift
;;
-D|--define)
add_list "$2" "CFLG" "D" ; shift
;;
-l|--libs)
add_list "$2" "LIBS" "l" ; shift
;;
-U|--undefine)
add_list "$2" "CFLG" "U" ; shift
;;
--cflags)
add_args "CFLG" "$2" ; shift
;;
--ldflags)
add_args "LIBS" "$2" ; shift
;;
--cppflags)
add_args "CPPFLAGS" "$2" ; shift
;;
--cxxflags)
add_args "CXXFLG" "$2" ; shift
;;
--sysroot)
SYSROOT=$1 ; shift
;;
-v|--gccversion)
if [ "$2" == "4.9" ] || [ "$2" == "4.8" ]; then
TCVER="$2"
else
echo "Invalid argument to -v or --gccversion: <$2>"
echo "Must be either 4.8 or 4.9. defaulting to 4.8"
TCVER="4.8"
fi
shift
;;
--)
shift ; break
;;
*)
echo "Should not have gotten here."
echo "Error in parsing arguments -- Unexpected argument found before end-of-args: $1"
usage
finish
;;
esac
shift
done
TCVER=${TCVER:-4.8}
CXXVER=${TCVER:-4.8}
if [ -z "$ALT_TOOLCHAIN" ]; then
NDK=${NDK_ROOT}/toolchains/arm-linux-androideabi-${TCVER}/prebuilt/linux-$(uname -m)/bin
SYSROOT=${SYSROOT:-${NDK_ROOT}/platforms/${PLATFORM}/arch-arm}
else
NDK="$ALT_TOOLCHAIN"
SYSROOT=${SYSROOT:-/opt/sysroot}
fi
if [ -z "$NOHOST" ]; then
HOSTARG=${HOSTARG:---host=$HOST}
fi
declare -A cxxflag
cxxflag[armeabi]="-no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -frtti -fexceptions -O2 -g -DNDEBUG -fomit-frame-pointer -DANDROID "
cxxflag[armeabi-v7a]="-no-canonical-prefixes -march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -frtti -fexceptions -O2 -g -DNDEBUG -fomit-frame-pointer -DANDROID "
cxxflag[armeabi-v7a-hard]="-no-canonical-prefixes -march=armv7-a -mfpu=vfpv3-d16 -mhard-float -D_NDK_MATH_NO_SOFTFP=1 -frtti -fexceptions -O2 -g -DNDEBUG -fomit-frame-pointer -DANDROID "
cxxflag[arm]=" -DANDROID -mandroid -fomit-frame-pointer"
declare -A cflag
cflag[arm]=" -DANDROID -mandroid -fomit-frame-pointer"
cflag[armeabi]="-no-canonical-prefixes -march=armv5te -msoft-float -O2 -g -DNDEBUG -fomit-frame-pointer -DANDROID "
cflag[armeabi-v7a]="-no-canonical-prefixes -march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -O2 -g -DNDEBUG -fomit-frame-pointer -DANDROID "
cflag[armeabi-v7a-hard]="-no-canonical-prefixes -march=armv7-a -mfpu=vfpv3-d16 -mhard-float -D_NDK_MATH_NO_SOFTFP=1 -O2 -g -DNDEBUG -fomit-frame-pointer -DANDROID "
declare -A cxxinclude
cxxinclude[gnustl]="-I${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/${TCVER}/include -I${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/${TCVER}/libs/${ARCH}/include -I${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/${TCVER}/include/backward"
cxxinclude[stlport]="-I${NDK_ROOT}/sources/cxx-stl/stlport/stlport -I${NDK_ROOT}/sources/cxx-stl/gabi++/include"
cxxinclude[stdc++]="-I${NDK_ROOT}/sources/cxx-stl/system/include"
cxxinclude[gabi++]="-I${NDK_ROOT}/sources/cxx-stl/gabi++/includexx/include -I${NDK_ROOT}/sources/cxx-stl/llvm-libc++abi/libcxxabi/include"
cxxinclude[c++]="-I${NDK_ROOT}/sources/cxx-stl/llvm-libc++/libcxx/include"
declare -A cxxlib
cxxlib[gnustl]="-L${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/${TCVER}/libs/${ARCH}"
cxxlib[gabi++]="-L${NDK_ROOT}/sources/cxx-stl/gabi++/libs/${ARCH}"
cxxlib[stlport]="-L${NDK_ROOT}/sources/cxx-stl/stlport/libs/${ARCH}"
cxxlib[stdc++]=" "
cxxlib[c++]="-L${NDK_ROOT}/sources/cxx-stl/llvm-libc++/libs/${ARCH}"
declare -A ldflag
ldflag[arm]="-lgcc -lc -lm -fpic"
ldflag[armeabi]="-fpic -no-canonical-prefixes -Wl,--no-undefined -Wl,-z,noexecstack -lgcc -lc -lm"
ldflag[armeabi-v7a]="-fpic -lgcc -no-canonical-prefixes -march=armv7-a -Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,-z,noexecstack -lc -lm"
ldflag[armeabi-v7a-hard]="-fpic -lgcc -no-canonical-prefixes -march=armv7-a -Wl,--fix-cortex-a8 -Wl,--no-warn-mismatch -lm_hard -Wl,--no-undefined -Wl,-z,noexecstack -lc -lm"
CPPFLAGS+=" ${CFLG}"
CFLG+=" ${cflag[${ARCH}]}"
STL_BASE=${STL%_shared}
STL_BASE=${STL_BASE%_static}
CXXFLG+=" ${cxxflag[${ARCH}]} ${cxxinclude[${STL_BASE}]} ${cxxlib[${STL_BASE}]} -l${STL}"
CC="${CROSS_COMPILE}-gcc --sysroot=${SYSROOT}"
CXX="${CROSS_COMPILE}-g++ --sysroot=${SYSROOT}"
AR="${CROSS_COMPILE}-ar"
LD="${CROSS_COMPILE}-ld"
NM="${CROSS_COMPILE}-nm"
CPP="${CC} -E"
STRIP="${CROSS_COMPILE}-strip --strip-unneeded"
OBJDUMP="${CROSS_COMPILE}-objdump"
RANLIB="${CROSS_COMPILE}-ranlib"
LIBS+=" ${ldflag[${ARCH}]}"
prints() {
_str="$@"
echo "$_str"
echo "$_str" >>$LOG
}
LOG=$PWD/prepare.log
echo "Preparing source files for compilation on $HOST..." >$LOG
edit_line() {
regex='echo $1'; shift
rfile=$1; shift
sed -i -r -e "$regex" $rfile 2>>$LOG 1>>$LOG
}
finish() {
if [ ! -z "$OLDDIR" ]; then
cd $OLDDIR
fi
exit 0
}
fix_makefile() {
mkfile=$1
cp $mkfile $mkfile.bak
HAS_CC=$(${GREP} -E '^CC[ ]?=.*' $mkfile)
if [ "${HAS_CC}X" == "X" ]; then
LINE=$(${GREP} -n -E '^[^#]+' $mkfile | head -n 1 | ${GREP} -o -E '^[0-9]+')
${SED} -i -r -e "$LINE iCC= " $mkfile
fi
edit_line "s:^(CC\s?=\s?).*: ${CC} :" $mkfile
edit_line "s:^(AR\s?=\s?)[^ ]*: ${AR} :" $mkfile
edit_line "s:^(CFLAGS|CCOPT)(\s?=\s?): ${CFLG} :" $mkfile
edit_line "s:^(LDFLAGS\s?=\s?): ${LIBS} :" $mkfile
edit_line "s:^(RANLIB\s?=\s?).*: ${RANLIB} :" $mkfile
edit_line "s:^(CXX\s?=\s?).*: ${CXX} :" $mkfile
edit_line "s:^(LD\s?=\s?)[^ ]*: ${LD} :" $mkfile
edit_line "s:^(OBJDUMP\s?=\s?)[^ ]*: ${OBJDUMP} :" $mkfile
edit_line "s:^(NM\s?=\s?)[^ ]*: ${NM} :" $mkfile
edit_line "s:^(OBJDUMP\s?=\s?).*: ${STRIP} :" $mkfile
edit_line "s:^(CPP\s?=\s?)[^ ]*: ${CPP} :" $mkfile
}
custom_conf() {
SUBMK=$(find . -name Makefile -print)
for mk in ${SUBMK}; do
prints "Fixing makefile at: $mk..."
prints "Backup made at: $mk.bak"
fix_makefile $mk
done
}
add_once() {
if [ -n "$(echo $PATH | ${GREP} $NDK)" ]; then
PATH=${NDK}:${PATH}
export PATH NDK
fi
}
cat >$(pwd)/env.sh <<EOF
#!/bin/bash
NDK=${NDK_ROOT}/toolchains/arm-linux-androideabi-${TCVER}/prebuilt/linux-\$(uname -m)/bin
if [ -z "\$(echo \$PATH | fgrep \$NDK)" ]; then
PATH=\${NDK}:\${PATH}
export PATH NDK
fi
EOF
chmod 0755 env.sh
. env.sh
if [ -n "$PRINT_CONFIG" ]; then
if [ -n "$NO_ARGS" ]; then
unset HOSTARG NEWARGV
fi
echo CPPFLAGS=\"${CPPFLAGS}\" CFLAGS=\"${CFLG}\" CXXFLAGS=\"${CXXFLG}\" LDFLAGS=\"${LIBS}\" CC=\"${CC}\" CXX=\"${CXX}\" LD=\"${LD}\" AR=\"${AR}\" RANLIB=\"${RANLIB}\" NM=\"${NM}\" STRIP=\"${STRIP}\" CPP=\"${CPP}\" ${NEWARGV} $@ ${HOSTARG}
finish
fi
if [ -f "$CONFIG_SCRIPT" ] || [ -n "$DO_CONFIG" ]; then
$CONFIG_SCRIPT CPPFLAGS="${CPPFLAGS}" CFLAGS="${CFLG}" CXXFLAGS="${CXXFLG}" LDFLAGS="${LIBS}" CC="${CC}" CXX="${CXX}" LD="${LD}" AR="${AR}" RANLIB="${RANLIB}" NM="${NM}" STRIP="${STRIP}" CPP="${CPP}" $NEWARGV $@ $HOSTARG
echo "Make sure ${NDK} is in your \$PATH before running make."
echo "A script called env.sh has been created in the current directory. Sourcing it will make sure the toolchain is in your path"
if [ "$?" != "0" ]; then
echo "[ERROR]: Configure failed with return code: $?"
export CPPFLAGS="${CPPFLAGS}" CFLAGS="${CFLG}" CXXFLAGS="${CXXFLG}" LDFLAGS="${LIBS}" CC="${CC}" CXX="${CXX}" LD="${LD}" AR="${AR}" RANLIB="${RANLIB}" NM="${NM}" STRIP="${STRIP}" CPP="${CPP}"
fi
else
prints "No configure script found in current directory: $(pwd)"
echo "Type 'y' to attempt to modify any makefiles in this directory, and any other key to abort..."
echo -n "Continue?: "
read ANS
if [ "$ANS" == "y" ]; then
custom_conf
fi
fi
finish