2011-07-22 181 views

回答

0

我已經成功交叉編譯它沒有錯誤。我沒有測試過這個庫本身,但是可執行文件的例子似乎起作用,所以這是一個好兆頭!

我放在一起的腳本(主要歸功於this link中的寶貴信息)應該適用於許多其他使用Autotools的項目(如Aubio的依賴項)。

請注意,libsndfilelibsamplerate需要一個補丁才能成功進行交叉編譯,我相信這很難看,但它很有用。

要使用它,根據您的系統修改腳本(應該是非常簡單的,我希望),下載所有的依賴項(在build xxxxx行中列出,您的版本可能會有所不同)與腳本並運行沒有參數的腳本。最後,所有內容都應位於$SYS_ROOT目錄內。

好的,主盤是以下:

#!/bin/bash 

# Taken and improved from : 
# http://cmumobileapps.com/2011/08/31/compiling-open-source-libraries-with-android-ndk-part-2 

# The designation for the host, usually "linux-x86" for standard linuxes, and 
# "darwin-x86" for OSX. 
HOST="linux-x86" 

# The target architecture. Here we're compiling for ARM using GCC 4.7 and 
# platform version 14. 
TARGET_ARCH="arm" 
TARGET_HOST="arm-eabi" 
TARGET_TOOLCHAIN="arm-linux-androideabi" 
TARGET_GCC_VERSION="4.7" 
TARGET_NDK_VERSION="14" 

# Add the toolchain to the path to be able to use the ARM compiler. 
export PATH="$ANDROID_NDK/toolchains/$TARGET_TOOLCHAIN-$TARGET_GCC_VERSION/prebuilt/$HOST/bin:$PATH" 

# Where to find the platform-specific files? 
export PLATFORM="$ANDROID_NDK/platforms/android-$TARGET_NDK_VERSION/arch-$TARGET_ARCH/" 

# Where to copy the platform-specific files? 
# Will be used later as the target system root for cross-compilation. 
export SYS_ROOT="`pwd`/sysroot/" 

# Executable names for the compilation toolchain 
export CC="$TARGET_TOOLCHAIN-gcc --sysroot=$SYS_ROOT" 
export CXX="$TARGET_TOOLCHAIN-g++ --sysroot=$SYS_ROOT" 
export CPP="$TARGET_TOOLCHAIN-cpp --sysroot=$SYS_ROOT" 
export LD="$TARGET_TOOLCHAIN-ld" 
export AR="$TARGET_TOOLCHAIN-ar" 
export RANLIB="$TARGET_TOOLCHAIN-ranlib" 
export STRIP="$TARGET_TOOLCHAIN-strip" 

# Add the STLPort library to the search path (needed for C++ files) 
export CXXFLAGS="-I$ANDROID_NDK/sources/cxx-stl/stlport/stlport/" 
export LDFLAGS="-L$ANDROID_NDK/sources/cxx-stl/stlport/libs/armeabi/ -lstlport_static" 

# Where to install the cross-compiled packages? 
# When running `make install`, all the files (executables, libraries, 
# documentation,...) will be in this directory. 
export INSTALL_DIR="$SYS_ROOT/usr/" 

# Where will pkg-config look for information about installed packages? 
export PKG_CONFIG_LIBDIR="$SYS_ROOT/usr/lib/pkgconfig/" 

################# 
# Configuration # 
################# 

# If the sysroot doesn't exist, create it and copy all the files from the NDK 
# distribution. 
if [[ ! -e "$SYS_ROOT" ]]; then 
    echo "Creating sysroot [$SYS_ROOT]" 
    cp -Rf "$PLATFORM" "$SYS_ROOT" || exit 2 
fi 

# If it doesn't exist, create the installation directory. 
if [[ ! -e "$INSTALL_DIR" ]]; then 
    echo "Creating installation directory [$INSTALL_DIR]" 
    mkdir -p $INSTALL_DIR || exit 3 
fi 

############### 
# Compilation # 
############### 

build() { 
    # Change directory to the package directory (in argument) 
    echo "Building $1" 
    pushd $1 

    # Clean things up (optional) 
    make clean 1>/dev/null 2>&1 

    # Configure the package 
    ./configure --host=$TARGET_HOST LIBS="-lc -lgcc" --prefix=$INSTALL_DIR || exit 1 

    # Compile 
    make || exit 1 

    # Install in $INSTALL_DIR 
    make install || exit 1 

    # Return to the original directory 
    popd 
} 

# Build all things 
build libogg-1.3.0 
build libvorbis-1.3.3 
build flac-1.2.1 
build libsndfile-1.0.25-patch 
build libsamplerate-0.1.8-patch 
build fftw-3.3.3 
build aubio-0.3.2 

libsndfile補丁

--- libsndfile-1.0.25/programs/sndfile-play.c 2012-12-31 17:03:34.289908113 +0100 
+++ libsndfile-1.0.25-patch/programs/sndfile-play.c 2012-12-31 17:04:05.326412364 +0100 
@@ -55,7 +55,7 @@ 
#if defined (__linux__) || defined (__FreeBSD_kernel__) || defined (__FreeBSD__) 
    #include <fcntl.h> 
    #include <sys/ioctl.h> 
- #include <sys/soundcard.h> 
+ #include <linux/soundcard.h> 

#elif (defined (__MACH__) && defined (__APPLE__)) 
    #include <Carbon.h> 
--- libsndfile-1.0.25/src/sndfile.c 2012-12-31 17:03:34.343241171 +0100 
+++ libsndfile-1.0.25-patch/src/sndfile.c 2013-01-01 18:53:37.436544846 +0100 
@@ -309,7 +309,7 @@ 
{ SF_PRIVATE *psf ; 

    /* Ultimate sanity check. */ 
- assert (sizeof (sf_count_t) == 8) ; 
+ /* assert (sizeof (sf_count_t) == 8) ; */ 

    if ((psf = calloc (1, sizeof (SF_PRIVATE))) == NULL) 
    { sf_errno = SFE_MALLOC_FAILED ; 

libsamplerate補丁

--- libsamplerate-0.1.8/examples/audio_out.c 2011-07-13 01:57:31.000000000 +0200 
+++ libsamplerate-0.1.8-patch/examples/audio_out.c 2013-01-01 17:24:58.257526888 +0100 
@@ -44,7 +44,7 @@ 

#include <fcntl.h> 
#include <sys/ioctl.h> 
-#include <sys/soundcard.h> 
+#include <linux/soundcard.h> 

#define LINUX_MAGIC  MAKE_MAGIC ('L', 'i', 'n', 'u', 'x', 'O', 'S', 'S') 
1

嘗試使用第Ë最新的git:

$ git clone git://git.aubio.org/git/aubio 
$ cd aubio/ 
$ ./waf configure build --with-target-platform ios 
0

這裏是一個構建腳本爲我工作:

#! /bin/sh 

""" 
build the toold chain home with: 
build/tools/make-standalone-toolchain.sh --platform=android-9 --install-dir=../android-9-toolchain 
""" 

NDK_HOME=~/dev/SDKs/android-9-toolchain 
set -x 
set -e 
export CC=$NDK_HOME/bin/arm-linux-androideabi-gcc 
export CFLAGS=-I$NDK_HOME/include 
export LDFLAGS="-L$NDK_HOME/lib" 
export AR=$NDK_HOME/bin/arm-linux-androideabi-ar 

./waf distclean 
./waf configure --with-target-platform android --disable-jack 
./waf build --verbose 
./waf install --destdir dist-android 

,則默認爲工具鏈/ gcc版本4.6,我把它改爲4.9,因爲這是我最新的。 應該拉下它需要完成編譯

腳本的主要部分是好心由Aubio

的保羅BROSSIER作者提供的庫