mstorsjo / fdk-aac

A standalone library of the Fraunhofer FDK AAC code from Android.
https://sourceforge.net/projects/opencore-amr/
Other
1.17k stars 385 forks source link

cross compilation error #27

Closed fugokidi closed 9 years ago

fugokidi commented 9 years ago

I'm building it for android. Configuration is Okay. When I make, i got this error, arm-linux-androideabi-4.9/bin/../lib/gcc/arm-linux-androideabi/4.9/../../../../arm-linux-androideabi/bin/ld: error: libAACdec/src/.libs/aacdec_drc.o:1:1: invalid character This error happened in all files of generated .libs for both libAACenc and libAACdec. I'm on Yosemite. I did this way. ./configure --host=arm-linux --enable-shared --enable-static --enable-example I used standalone androideabi compilor. I did my homework searching in google first. But I could not fix it and I've to ask you again. I'm sorry.

mstorsjo commented 9 years ago

You should probably be setting --host=arm-linux-androideabi instead of --host=arm-linux. If that isn't enough to solve it, please copypaste the last few commands from make V=1 (but please do make clean once first so that the output contains the commands for actually compiling a few files, not only trying to link them).

fugokidi commented 9 years ago

Thank you for helping me. I'm a student and I want to volunteer for the open source project. I've basic c, c++, python. I can learn more and can dedicate a few hours per week or everyday. If this project needs anything, please try me. It's compiled and got aac-enc. But it cannot be run in android. It says file directory not found. I tried to run it via adb shell. It cannot be run. The following is the normal make output. There is a make V=1 output at the end.

copying selected object files to avoid basename conflicts...
  CC       aac-enc.o
  CC       wavreader.o
  CCLD     aac-enc

I checked the executable with file command

fdk-aac: file aac-enc
aac-enc: POSIX shell script text executable

Normal, arm executable should give this; ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, not stripped I think aac-enc is not correct. The last few commands of make V=1

libtool: link: arm-linux-androideabi-ranlib .libs/libfdk-aac.a
libtool: link: rm -fr .libs/libfdk-aac.lax
libtool: link: ( cd ".libs" && rm -f "libfdk-aac.la" && ln -s "../libfdk-aac.la" "libfdk-aac.la" )
depbase=`echo aac-enc.o | sed 's|[^/]*$|.deps/&|;s|\.o$||'`;\
    /Users/0x1111/Desktop/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-gcc -DPACKAGE_NAME=\"fdk-aac\" -DPACKAGE_TARNAME=\"fdk-aac\" -DPACKAGE_VERSION=\"0.1.4\" -DPACKAGE_STRING=\"fdk-aac\ 0.1.4\" -DPACKAGE_BUGREPORT=\"http://sourceforge.net/projects/opencore-amr/\" -DPACKAGE_URL=\"\" -DPACKAGE=\"fdk-aac\" -DVERSION=\"0.1.4\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\".libs/\" -I.  -I./libAACdec/include -I./libAACenc/include -I./libSBRdec/include -I./libSBRenc/include -I./libMpegTPDec/include -I./libMpegTPEnc/include -I./libSYS/include -I./libFDK/include -I./libPCMutils/include   -g -O2 -MT aac-enc.o -MD -MP -MF $depbase.Tpo -c -o aac-enc.o aac-enc.c &&\
    mv -f $depbase.Tpo $depbase.Po
depbase=`echo wavreader.o | sed 's|[^/]*$|.deps/&|;s|\.o$||'`;\
    /Users/0x1111/Desktop/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-gcc -DPACKAGE_NAME=\"fdk-aac\" -DPACKAGE_TARNAME=\"fdk-aac\" -DPACKAGE_VERSION=\"0.1.4\" -DPACKAGE_STRING=\"fdk-aac\ 0.1.4\" -DPACKAGE_BUGREPORT=\"http://sourceforge.net/projects/opencore-amr/\" -DPACKAGE_URL=\"\" -DPACKAGE=\"fdk-aac\" -DVERSION=\"0.1.4\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\".libs/\" -I.  -I./libAACdec/include -I./libAACenc/include -I./libSBRdec/include -I./libSBRenc/include -I./libMpegTPDec/include -I./libMpegTPEnc/include -I./libSYS/include -I./libFDK/include -I./libPCMutils/include   -g -O2 -MT wavreader.o -MD -MP -MF $depbase.Tpo -c -o wavreader.o wavreader.c &&\
    mv -f $depbase.Tpo $depbase.Po
/bin/sh ./libtool  --tag=CC   --mode=link /Users/0x1111/Desktop/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-gcc  -g -O2   -o aac-enc aac-enc.o wavreader.o libfdk-aac.la -lm
libtool: link: /Users/0x1111/Desktop/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-gcc -g -O2 -o .libs/aac-enc aac-enc.o wavreader.o  ./.libs/libfdk-aac.so -lm -L/usr/local/lib
mstorsjo commented 9 years ago

The reason why aac-enc is created as a shell script is because you built the library with --enable-shared. When/if you do make install, the installed binary will be a real binary, not a shell script - the shell script is only used to allow you running the binary from within the directory where you compiled it. So for your case it's probably easiest to skip the --enable-shared.

fugokidi commented 9 years ago

Well, I've removed --enable-shared, but it's still giving me this;

 CXX      libFDK/src/scale.lo
  CXX      libSYS/src/cmdl_parser.lo
  CXX      libSYS/src/conv_string.lo
  CXX      libSYS/src/genericStds.lo
  CXX      libSYS/src/wav_file.lo
  GEN      libfdk-aac.la
copying selected object files to avoid basename conflicts...
  CC       aac-enc.o
  CC       wavreader.o
  CCLD     aac-enc
fdk-aac: file aac-enc
aac-enc: POSIX shell script text executable
fugokidi commented 9 years ago

I found something I compiled with --enable-shared, there is a hidden folder, .libs

.libs: ls
aac-enc*        libfdk-aac.la@  libfdk-aac.so*
libfdk-aac.a    libfdk-aac.lai  libfdk-aac.ver

But when I run it;

shell@A0001:/data/local/tmp $ ls
a
aac-enc
libfdk-aac.so
mixed.wav
shell@A0001:/data/local/tmp $ ./aac-enc
CANNOT LINK EXECUTABLE: could not load library "libfdk-aac.so" needed by "./aac-enc"; caused by library "libfdk-aac.so" not found
1|shell@A0001:/data/local/tmp $
mstorsjo commented 9 years ago

After you remove --enable-shared you need to do a full rebuild including make clean (or even better, make distclean) - otherwise it may still pick up the libfdk-aac.so (which is why it says it is missing). The safest would be to remove the whole build tree (or at least nuke the .libs directory).

If you want to run the shared library version, you can try to do export LD_LIBRARY_PATH=. before trying to run it, but if I remember correctly this isn't working in all android versions.

fugokidi commented 9 years ago

It's okay, i don't need to use shared library. My goal is I want to understand the AAC implementation in both ARM and intel core processors. I want to do test run on both and track data; how it's compressed practically. Let me brief my observation; for mac compilation with ./configure --enable-example --enable-static, aac-enc is a wrapper text script executable generated by libtool, there is a library, it is in .libs, and is called aac-enc as well, the script executable, cannot run without ./libs/aac-enc. For arm-linux-androideabi compilation with ./configure --host=arm-linux-androideabi --enable-example --enable-static, the same wrapper, aac-enc and ./libs/aac-enc are generated(ARM executable). But the problem is the wrapper script text executable cannot be run in android shell, I think it is because of libtool. I ran strings aac-enc.

#! /bin/sh
# aac-enc - temporary wrapper script for .libs/aac-enc
# Generated by libtool (GNU libtool) 2.4.4
# The aac-enc program cannot be directly executed until all the libtool
# libraries that it depends on are installed.
# This wrapper script should never be moved out of the build directory.
# If it is, it will not operate correctly.
# Sed substitution that helps us do robust quoting.  It backslashifies
# metacharacters that are still active within double-quoted strings.
sed_quote_subst='s|\([`"$\\]\)|\\\1|g'
# Be Bourne compatible
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
  emulate sh
  NULLCMD=:
  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '${1+"$@"}'='"$@"'
  setopt NO_GLOB_SUBST
else
  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
BIN_SH=xpg4; export BIN_SH # for Tru64
DUALCASE=1; export DUALCASE # for MKS sh
# The HP-UX ksh and POSIX shell print the target directory to stdout
# if CDPATH is set.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
relink_command=""
# This environment variable determines our operation mode.
if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then
  # install mode needs the following variables:
  generated_by_libtool_version='2.4.4'
  notinst_deplibs=' libfdk-aac.la'
else
  # When we are sourced in execute mode, $file and $ECHO are already set.
  if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
    file="$0"
# A function that is used when there is no print builtin or printf.
func_fallback_echo ()
  eval 'cat <<_LTECHO_EOF
_LTECHO_EOF'
    ECHO="printf %s\\n"
  fi
# Very basic option parsing. These options are (a) specific to
# the libtool wrapper, (b) are identical between the wrapper
# /script/ and the wrapper /executable/ that is used only on
# windows platforms, and (c) all begin with the string --lt-
# (application programs are unlikely to have options that match
# this pattern).
# There are only two supported options: --lt-debug and
# --lt-dump-script. There is, deliberately, no --lt-help.
# The first argument to this parsing function should be the
# script's ./libtool value, followed by no.
lt_option_debug=
func_parse_lt_options ()
  lt_script_arg0=$0
  shift
  for lt_opt
  do
    case "$lt_opt" in
    --lt-debug) lt_option_debug=1 ;;
    --lt-dump-script)
        lt_dump_D=`$ECHO "X$lt_script_arg0" | /usr/bin/sed -e 's/^X//' -e 's%/[^/]*$%%'`
        test "X$lt_dump_D" = "X$lt_script_arg0" && lt_dump_D=.
        lt_dump_F=`$ECHO "X$lt_script_arg0" | /usr/bin/sed -e 's/^X//' -e 's%^.*/%%'`
        cat "$lt_dump_D/$lt_dump_F"
        exit 0
      ;;
    --lt-*)
        $ECHO "Unrecognized --lt- option: '$lt_opt'" 1>&2
        exit 1
      ;;
    esac
  done
  # Print the debug banner immediately:
  if test -n "$lt_option_debug"; then
    echo "aac-enc:aac-enc:$LINENO: libtool wrapper (GNU libtool) 2.4.4" 1>&2
  fi
# Used when --lt-debug. Prints its arguments to stdout
# (redirection is the responsibility of the caller)
func_lt_dump_args ()
  lt_dump_args_N=1;
  for lt_arg
  do
    $ECHO "aac-enc:aac-enc:$LINENO: newargv[$lt_dump_args_N]: $lt_arg"
    lt_dump_args_N=`expr $lt_dump_args_N + 1`
  done
# Core function for launching the target application
func_exec_program_core ()
      if test -n "$lt_option_debug"; then
        $ECHO "aac-enc:aac-enc:$LINENO: newargv[0]: $progdir/$program" 1>&2
        func_lt_dump_args ${1+"$@"} 1>&2
      fi
      exec "$progdir/$program" ${1+"$@"}
      $ECHO "$0: cannot exec $program $*" 1>&2
      exit 1
# A function to encapsulate launching the target application
# Strips options in the --lt-* namespace from $@ and
# launches target application with the remaining arguments.
func_exec_program ()
  case " $* " in
  *\ --lt-*)
    for lt_wr_arg
    do
      case $lt_wr_arg in
      --lt-*) ;;
      *) set x "$@" "$lt_wr_arg"; shift;;
      esac
      shift
    done ;;
  esac
  func_exec_program_core ${1+"$@"}
  # Parse options
  func_parse_lt_options "$0" ${1+"$@"}
  # Find the directory that this script lives in.
  thisdir=`$ECHO "$file" | /usr/bin/sed 's%/[^/]*$%%'`
  test "x$thisdir" = "x$file" && thisdir=.
  # Follow symbolic links until we get to the real thisdir.
  file=`ls -ld "$file" | /usr/bin/sed -n 's/.*-> //p'`
  while test -n "$file"; do
    destdir=`$ECHO "$file" | /usr/bin/sed 's%/[^/]*$%%'`
    # If there was a directory component, then change thisdir.
    if test "x$destdir" != "x$file"; then
      case "$destdir" in
      [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;;
      *) thisdir="$thisdir/$destdir" ;;
      esac
    fi
    file=`$ECHO "$file" | /usr/bin/sed 's%^.*/%%'`
    file=`ls -ld "$thisdir/$file" | /usr/bin/sed -n 's/.*-> //p'`
  done
  # Usually 'no', except on cygwin/mingw when embedded into
  # the cwrapper.
  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=no
  if test "$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR" = "yes"; then
    # special case for '.'
    if test "$thisdir" = "."; then
      thisdir=`pwd`
    fi
    # remove .libs from thisdir
    case "$thisdir" in
    *[\\/].libs ) thisdir=`$ECHO "$thisdir" | /usr/bin/sed 's%[\\/][^\\/]*$%%'` ;;
    .libs )   thisdir=. ;;
    esac
  fi
  # Try to get the absolute directory name.
  absdir=`cd "$thisdir" && pwd`
  test -n "$absdir" && thisdir="$absdir"
  program='aac-enc'
  progdir="$thisdir/.libs"
  if test -f "$progdir/$program"; then
    # Add our own library path to LD_LIBRARY_PATH
    LD_LIBRARY_PATH="/Users/0x1111/Desktop/fdk-aac/.libs:$LD_LIBRARY_PATH"
    # Some systems cannot cope with colon-terminated LD_LIBRARY_PATH
    # The second colon is a workaround for a bug in BeOS R4 sed
    LD_LIBRARY_PATH=`$ECHO "$LD_LIBRARY_PATH" | /usr/bin/sed 's/::*$//'`
    export LD_LIBRARY_PATH
    if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
      # Run the actual program with our arguments.
      func_exec_program ${1+"$@"}
    fi
  else
    # The program doesn't exist.
    $ECHO "$0: error: '$progdir/$program' does not exist" 1>&2
    $ECHO "This script is just a wrapper for $program." 1>&2
    $ECHO "See the libtool documentation for more information." 1>&2
    exit 1
  fi

Is there any way to make the wrapper script runnable in android shell?. I think library is compiled successfully. Or any tips that I can make an interface to be able to run on android shell? I mean, is it possible to avoid libtool? Thank you.

fugokidi commented 9 years ago

Dear Sir/Madam, Problem solved. The default configuration is with --enable-shared. I disabled it with

./configure --host=arm-linux-androideabi --enable-static --enable-example --disable-shared

I got ARM ELF executable and it perfectly works in android shell. Thank you very much. Seriously I would like to return something for helping me. I learned a lot here. I could not find your email. I'm sorry I've to say it here. If you don't mind, I want to have your email and would like to keep in touch. I really appreciate your explanation. Without your help, I'll not be able to run it. Thank you.