恩,我参照openssl写了一个脚本,现在speex编译成功,在build/output目录下生成了include,lib,
然后参照openssl把对应的头文件和库文件添加进来,但是编译的时候会报如下错误,
[*] link ffmpeg
-Wl,--fix-cortex-a8
libavcodec/libspeexdec.c:146: error: undefined reference to 'speex_bits_remaining'
libavcodec/libspeexdec.c:156: error: undefined reference to 'speex_bits_read_from'
libavcodec/libspeexdec.c:161: error: undefined reference to 'speex_decode_int'
libavcodec/libspeexdec.c:147: error: undefined reference to 'speex_bits_peek_unsigned'
libavcodec/libspeexdec.c:172: error: undefined reference to 'speex_decoder_ctl'
libavcodec/libspeexdec.c:167: error: undefined reference to 'speex_decode_stereo_int'
libavcodec/libspeexdec.c:180: error: undefined reference to 'speex_bits_destroy'
libavcodec/libspeexdec.c:181: error: undefined reference to 'speex_decoder_destroy'
libavcodec/libspeexdec.c:48: error: undefined reference to 'speex_packet_to_header'
libavcodec/libspeexdec.c:73: error: undefined reference to 'speex_header_free'
libavcodec/libspeexdec.c:88: error: undefined reference to 'speex_lib_get_mode'
libavcodec/libspeexdec.c:106: error: undefined reference to 'speex_bits_init'
libavcodec/libspeexdec.c:107: error: undefined reference to 'speex_decoder_init'
libavcodec/libspeexdec.c:119: error: undefined reference to 'speex_decoder_ctl'
libavcodec/libspeexdec.c:123: error: undefined reference to 'speex_nb_mode'
libavcodec/libspeexdec.c:123: error: undefined reference to 'speex_std_stereo_request_handler'
libavcodec/libspeexdec.c:189: error: undefined reference to 'speex_bits_reset'
collect2: error: ld returned 1 exit status
我改的do-compile-ffmpeg.sh的脚本如下,现在只是编了armv7a一个架构,请问一下哪些地方还需要改的?谢谢了!
FF_BUILD_ROOT=pwd
FF_ANDROID_PLATFORM=android-9
FF_GCC_VER=4.8
FF_GCC_64_VER=4.9
FF_BUILD_NAME=
FF_SOURCE=
FF_CROSS_PREFIX=
FF_DEP_OPENSSL_INC=
FF_DEP_OPENSSL_LIB=
FF_DEP_SPEEX_INC=
FF_DEP_SPEEX_LIB=
FF_CFG_FLAGS=
FF_EXTRA_CFLAGS=
FF_EXTRA_LDFLAGS=
FF_DEP_LIBS=
FF_ASM_OBJ_DIR=
#--------------------
echo ""
echo "--------------------"
echo "[] make NDK standalone toolchain"
echo "--------------------"
FF_MAKE_TOOLCHAIN_FLAGS=
case "$UNAME_S" in
Darwin)
FF_MAKE_TOOLCHAIN_FLAGS="$FF_MAKE_TOOLCHAIN_FLAGS --system=darwin-x86_64"
;;
CYGWIN_NT-)
FF_MAKE_TOOLCHAIN_FLAGS="$FF_MAKE_TOOLCHAIN_FLAGS --system=windows-x86_64"
FF_WIN_TEMP="$(cygpath -am /tmp)"
export TEMPDIR=$FF_WIN_TEMP/
echo "Cygwin temp prefix=$FF_WIN_TEMP/"
#FF_CFG_FLAGS="$FF_CFG_FLAGS --tempprefix=$FF_WIN_TEMP/"
;;
esac
#----- armv7a begin -----
if [ "$FF_ARCH" = "armv7a" ]; then
FF_BUILD_NAME=ffmpeg-armv7a
FF_BUILD_NAME_OPENSSL=openssl-armv7a
FF_BUILD_NAME_SPEEX=speex-armv7a
FF_SOURCE=$FF_BUILD_ROOT/$FF_BUILD_NAME
FF_CROSS_PREFIX=arm-linux-androideabi
FF_TOOLCHAIN_NAME=${FF_CROSS_PREFIX}-${FF_GCC_VER}
FF_CFG_FLAGS="$FF_CFG_FLAGS --arch=arm --cpu=cortex-a8"
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-neon"
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-thumb"
FF_EXTRA_CFLAGS="$FF_EXTRA_CFLAGS -march=armv7-a -mcpu=cortex-a8 -mfpu=vfpv3-d16 -mfloat-abi=softfp -mthumb"
FF_EXTRA_LDFLAGS="$FF_EXTRA_LDFLAGS -Wl,--fix-cortex-a8"
FF_ASM_OBJ_DIR="libavutil/arm/*.o libavcodec/arm/*.o libswresample/arm/*.o"
elif [ "$FF_ARCH" = "armv5" ]; then
FF_BUILD_NAME=ffmpeg-armv5
FF_BUILD_NAME_OPENSSL=openssl-armv5
FF_SOURCE=$FF_BUILD_ROOT/$FF_BUILD_NAME
FF_CROSS_PREFIX=arm-linux-androideabi
FF_TOOLCHAIN_NAME=${FF_CROSS_PREFIX}-${FF_GCC_VER}
FF_CFG_FLAGS="$FF_CFG_FLAGS --arch=arm"
FF_EXTRA_CFLAGS="$FF_EXTRA_CFLAGS -march=armv5te -mtune=arm9tdmi -msoft-float"
FF_EXTRA_LDFLAGS="$FF_EXTRA_LDFLAGS"
FF_ASM_OBJ_DIR="libavutil/arm/*.o libavcodec/arm/*.o libswresample/arm/*.o"
elif [ "$FF_ARCH" = "x86" ]; then
FF_BUILD_NAME=ffmpeg-x86
FF_BUILD_NAME_OPENSSL=openssl-x86
FF_SOURCE=$FF_BUILD_ROOT/$FF_BUILD_NAME
FF_CROSS_PREFIX=i686-linux-android
FF_TOOLCHAIN_NAME=x86-${FF_GCC_VER}
FF_CFG_FLAGS="$FF_CFG_FLAGS --arch=x86 --cpu=i686 --enable-yasm"
FF_EXTRA_CFLAGS="$FF_EXTRA_CFLAGS -march=atom -msse3 -ffast-math -mfpmath=sse"
FF_EXTRA_LDFLAGS="$FF_EXTRA_LDFLAGS"
FF_ASM_OBJ_DIR="libavutil/x86/*.o libavcodec/x86/*.o libswresample/x86/*.o libswscale/x86/*.o"
elif [ "$FF_ARCH" = "arm64" ]; then
FF_ANDROID_PLATFORM=android-21
FF_BUILD_NAME=ffmpeg-arm64
FF_BUILD_NAME_OPENSSL=openssl-arm64
FF_SOURCE=$FF_BUILD_ROOT/$FF_BUILD_NAME
FF_CROSS_PREFIX=aarch64-linux-android
FF_TOOLCHAIN_NAME=${FF_CROSS_PREFIX}-${FF_GCC_64_VER}
FF_CFG_FLAGS="$FF_CFG_FLAGS --arch=aarch64 --enable-yasm"
FF_EXTRA_CFLAGS="$FF_EXTRA_CFLAGS"
FF_EXTRA_LDFLAGS="$FF_EXTRA_LDFLAGS"
FF_ASM_OBJ_DIR="libavutil/aarch64/*.o libavcodec/aarch64/*.o libswresample/aarch64/*.o libavcodec/neon/*.o"
else
echo "unknown architecture $FF_ARCH";
exit 1
fi
FF_TOOLCHAIN_PATH=$FF_BUILD_ROOT/build/$FF_BUILD_NAME/toolchain
FF_MAKE_TOOLCHAIN_FLAGS="$FF_MAKE_TOOLCHAIN_FLAGS --install-dir=$FF_TOOLCHAIN_PATH"
FF_SYSROOT=$FF_TOOLCHAIN_PATH/sysroot
FF_PREFIX=$FF_BUILD_ROOT/build/$FF_BUILD_NAME/output
FF_DEP_OPENSSL_INC=$FF_BUILD_ROOT/build/$FF_BUILD_NAME_OPENSSL/output/include
FF_DEP_OPENSSL_LIB=$FF_BUILD_ROOT/build/$FF_BUILD_NAME_OPENSSL/output/lib
FF_DEP_SPEEX_INC=$FF_BUILD_ROOT/build/$FF_BUILD_NAME_SPEEX/output/include
FF_DEP_SPEEX_LIB=$FF_BUILD_ROOT/build/$FF_BUILD_NAME_SPEEX/output/lib
case "$UNAME_S" in
CYGWIN_NT-*)
FF_SYSROOT="$(cygpath -am $FF_SYSROOT)"
FF_PREFIX="$(cygpath -am $FF_PREFIX)"
;;
esac
mkdir -p $FF_PREFIX
mkdir -p $FF_SYSROOT
FF_MAKEFLAGS=
if which nproc >/dev/null
then
FF_MAKEFLAGS=-jnproc
elif [ "$UNAMES" = "Darwin" ] && which sysctl >/dev/null
then
FF_MAKEFLAGS=-jsysctl -n machdep.cpu.thread_count
fi
FF_TOOLCHAIN_TOUCH="$FF_TOOLCHAIN_PATH/touch"
if [ ! -f "$FF_TOOLCHAIN_TOUCH" ]; then
$ANDROID_NDK/build/tools/make-standalone-toolchain.sh
$FF_MAKE_TOOLCHAIN_FLAGS
--platform=$FF_ANDROID_PLATFORM
--toolchain=$FF_TOOLCHAIN_NAME
touch $FF_TOOLCHAIN_TOUCH;
fi
#--------------------
echo ""
echo "--------------------"
echo "[*] check ffmpeg env"
echo "--------------------"
export PATH=$FF_TOOLCHAIN_PATH/bin/:$PATH
#export CC="ccache ${FF_CROSS_PREFIX}-gcc"
export CC="${FF_CROSS_PREFIX}-gcc"
export LD=${FF_CROSS_PREFIX}-ld
export AR=${FF_CROSS_PREFIX}-ar
export STRIP=${FF_CROSS_PREFIX}-strip
FF_CFLAGS="-O3 -Wall -pipe
-std=c99
-ffast-math
-fstrict-aliasing -Werror=strict-aliasing
-Wno-psabi -Wa,--noexecstack
-DANDROID -DNDEBUG"
cause av_strlcpy crash with gcc4.7, gcc4.8
-fmodulo-sched -fmodulo-sched-allow-regmoves
--enable-thumb is OK
#FF_CFLAGS="$FF_CFLAGS -mthumb"
not necessary
#FF_CFLAGS="$FF_CFLAGS -finline-limit=300"
export COMMON_FF_CFG_FLAGS=
. $FF_BUILD_ROOT/../../config/module.sh
#--------------------
with openssl
if [ -f "${FF_DEP_OPENSSL_LIB}/libssl.a" ]; then
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-nonfree"
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-openssl"
FF_CFLAGS="$FF_CFLAGS -I${FF_DEP_OPENSSL_INC}"
FF_DEP_LIBS="-L${FF_DEP_OPENSSL_LIB} -lssl -lcrypto"
fi
#--------------------
with speex
if [ -f "${FF_DEP_SPEEX_LIB}/libspeex.a" ]; then
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-nonfree"
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-libspeex"
echo "------------- find speex -----------"
echo $FF_DEP_SPEEX_INC
echo $FF_DEP_SPEEX_LIB
echo "------------------------------------"
FF_CFLAGS="$FF_CFLAGS -I${FF_DEP_SPEEX_INC}"
FF_DEP_LIBS="-L${FF_DEP_SPEEX_LIB}"
fi
FF_CFG_FLAGS="$FF_CFG_FLAGS $COMMON_FF_CFG_FLAGS"
#--------------------
Standard options:
FF_CFG_FLAGS="$FF_CFG_FLAGS --prefix=$FF_PREFIX"
Advanced options (experts only):
FF_CFG_FLAGS="$FF_CFG_FLAGS --cross-prefix=${FF_CROSS_PREFIX}-"
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-cross-compile"
FF_CFG_FLAGS="$FF_CFG_FLAGS --target-os=linux"
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-pic"
FF_CFG_FLAGS="$FF_CFG_FLAGS --disable-symver"
Optimization options (experts only):
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-asm"
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-inline-asm"
#--------------------
echo ""
echo "--------------------"
echo "[*] configurate ffmpeg"
echo "--------------------"
cd $FF_SOURCE
if [ -f "./config.h" ]; then
echo 'reuse configure'
else
which $CC
./configure $FF_CFG_FLAGS
--extra-libs=-lgcc
--extra-cflags="$FF_CFLAGS $FF_EXTRA_CFLAGS"
--extra-ldflags="$FF_DEP_LIBS $FF_EXTRA_LDFLAGS"
make clean
fi
#--------------------
echo ""
echo "--------------------"
echo "[] compile ffmpeg"
echo "--------------------"
cp config. $FF_PREFIX
make $FF_MAKEFLAGS
make install
#--------------------
echo ""
echo "--------------------"
echo "[] link ffmpeg"
echo "--------------------"
echo $FF_EXTRA_LDFLAGS
$CC -lm -lz -shared --sysroot=$FF_SYSROOT -Wl,--no-undefined -Wl,-z,noexecstack $FF_EXTRA_LDFLAGS
-Wl,-soname,libnelpengine.so
compat/.o
libavutil/.o
libavcodec/.o
libavformat/.o
libswresample/.o
libswscale/*.o
$FF_ASM_OBJ_DIR
$FF_DEP_LIBS
-o $FF_PREFIX/libnelpengine.so
mysedi() {
f=$1
exp=$2
n=basename $f
cp $f /tmp/$n
sed $exp /tmp/$n > $f
rm /tmp/$n
}
echo ""
echo "--------------------"
echo "[] create files for shared ffmpeg"
echo "--------------------"
rm -rf $FF_PREFIX/shared
mkdir -p $FF_PREFIX/shared/lib/pkgconfig
ln -s $FF_PREFIX/include $FF_PREFIX/shared/include
ln -s $FF_PREFIX/libnelpengine.so $FF_PREFIX/shared/lib/libnelpengine.so
cp $FF_PREFIX/lib/pkgconfig/.pc $FF_PREFIX/shared/lib/pkgconfig
for f in $FF_PREFIX/lib/pkgconfig/*.pc; do
# in case empty dir
if [ ! -f $f ]; then
continue
fi
cp $f $FF_PREFIX/shared/lib/pkgconfig
f=$FF_PREFIX/shared/lib/pkgconfig/basename $f
# OSX sed doesn't have in-place(-i)
mysedi $f 's//output//output/shared/g'
mysedi $f 's/-lavcodec/-lnelpengine/g'
mysedi $f 's/-lavformat/-lnelpengine/g'
mysedi $f 's/-lavutil/-lnelpengine/g'
mysedi $f 's/-lswresample/-lnelpengine/g'
mysedi $f 's/-lswscale/-lnelpengine/g'
done