简体   繁体   English

带有libx264的Android ffmpeg-未定义的引用

[英]Android ffmpeg with libx264 - undefined references

I'm building ffmpeg for Android with libx264 using appunite's project under Ubuntu 15.10. 我正在Ubuntu 15.10下使用appunite的项目使用libx264构建Android的ffmpeg。 I've build it without libx264 properly, but adding the library keep giving me undefined reference to 'x264_picture_init' and multiple other similar errors. 我在没有libx264的情况下正确构建了它,但是添加该库后,一直给我undefined reference to 'x264_picture_init'以及其他多个类似的错误。 I tried variety of possible solutions from mailing lists/other SO questions, but still nothing helps me solving the problem. 我从邮件列表/其他SO问题中尝试了各种可能的解决方案,但仍然无济于事。

I have removed ffmpeg/libx264/libx264-dev packages to avoid possible duplicate libraries in the system. 我删除了ffmpeg / libx264 / libx264-dev软件包,以避免系统中可能存在重复的库。 I've got the libx264.a library in ffmpeg-build/ARCH/lib, where the other built libraries lives. 我在ffmpeg-build / ARCH / lib中有libx264.a库,其他构建的库也位于其中。 Also I don't think this is caused by header file not matching the library, because the only x264.h header in the system is the one used for the library building. 我也不认为这是由于头文件与库不匹配引起的,因为系统中唯一的x264.h头是用于库构建的头。

Here is my build_android.sh. 这是我的build_android.sh。

set -x

if [ "$ANDROID_NDK_HOME" = "" ]; then
    echo ANDROID_NDK_HOME variable not set, exiting
    echo "Use: export ANDROID_NDK_HOME=/your/path/to/android-ndk"
    exit 1
fi

# Get the newest arm-linux-androideabi version
if [ -z "$COMPILATOR_VERSION" ]; then
    DIRECTORIES=$ANDROID_NDK_HOME/toolchains/arm-linux-androideabi-*
    for i in $DIRECTORIES; do
        PROPOSED_NAME=${i#*$ANDROID_NDK_HOME/toolchains/arm-linux-androideabi-}
        if [[ $PROPOSED_NAME =~ ^[0-9\.]+$ ]] ; then
            echo "Available compilator version: $PROPOSED_NAME"
            COMPILATOR_VERSION=$PROPOSED_NAME
        fi
    done
fi

if [ -z "$COMPILATOR_VERSION" ]; then
    echo "Could not find compilator"
    exit 1
fi

if [ ! -d $ANDROID_NDK_HOME/toolchains/arm-linux-androideabi-$COMPILATOR_VERSION ]; then
    echo $ANDROID_NDK_HOME/toolchains/arm-linux-androideabi-$COMPILATOR_VERSION does not exist
    exit 1
fi
echo "Using compilator version: $COMPILATOR_VERSION"

OS_ARCH=`basename $ANDROID_NDK_HOME/toolchains/arm-linux-androideabi-$COMPILATOR_VERSION/prebuilt/*`
echo "Using architecture: $OS_ARCH"


function setup_paths
{
    export PLATFORM=$ANDROID_NDK_HOME/platforms/$PLATFORM_VERSION/arch-$ARCH/
    if [ ! -d $PLATFORM ]; then
        echo $PLATFORM does not exist
        exit 1
    fi
    echo "Using platform: $PLATFORM"
    export PATH=${PATH}:$PREBUILT/bin/
    export CROSS_COMPILE=$PREBUILT/bin/$EABIARCH-
    export CFLAGS=$OPTIMIZE_CFLAGS
    export CPPFLAGS="$CFLAGS"
    export CFLAGS="$CFLAGS"
    export CXXFLAGS="$CFLAGS"
    export CXX="${CROSS_COMPILE}g++ --sysroot=$PLATFORM"
    export AS="${CROSS_COMPILE}gcc --sysroot=$PLATFORM"
    export CC="${CROSS_COMPILE}gcc --sysroot=$PLATFORM"
    export PKG_CONFIG="${CROSS_COMPILE}pkg-config"
    export LD="${CROSS_COMPILE}ld"
    export NM="${CROSS_COMPILE}nm"
    export STRIP="${CROSS_COMPILE}strip"
    export RANLIB="${CROSS_COMPILE}ranlib"
    export AR="${CROSS_COMPILE}ar"
    export LDFLAGS="-Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib -lc -lm -ldl -llog"
    export PKG_CONFIG_LIBDIR=$PREFIX/lib/pkgconfig/
    export PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig/

    if [ ! -f "${CROSS_COMPILE}gcc" ]; then
        echo "Gcc does not exists in path: ${CROSS_COMPILE}gcc"
        exit 1;
    fi

    if [ ! -f "${PKG_CONFIG}" ]; then
        echo "Pkg config does not exists in path: ${PKG_CONFIG} - Probably BUG in NDK but..."
        set +e
        SYS_PKG_CONFIG=$(which pkg-config)
        if [ "$?" -ne 0 ]; then
            echo "This system does not contain system pkg-config, so we can do anything"
            exit 1
        fi
        set -e
        cat > $PKG_CONFIG << EOF
#!/bin/bash
pkg-config \$*
EOF
        chmod u+x $PKG_CONFIG
        echo "Because we have local pkg-config we will create it in ${PKG_CONFIG} directory using ${SYS_PKG_CONFIG}"
    fi
}

function build_x264
{
    echo "Starting build x264 for $ARCH"
    cd x264
    ./configure --prefix=$PREFIX --host=$ARCH-linux --enable-static --disable-shared --enable-pic --disable-cli $ADDITIONAL_CONFIGURE_FLAG

    make clean
    make -j4 install
    make clean
    cd ..
    echo "FINISHED x264 for $ARCH"
}

function build_amr
{
    echo "Starting build amr for $ARCH"
    cd vo-amrwbenc
    ./configure \
        --prefix=$PREFIX \
        --host=$ARCH-linux \
        --disable-dependency-tracking \
        --disable-shared \
        --enable-static \
        --with-pic \
        $ADDITIONAL_CONFIGURE_FLAG

    make clean
    make -j4 install
    make clean
    cd ..
    echo "FINISHED amr for $ARCH"
}

function build_aac
{
    echo "Starting build aac for $ARCH"
    cd vo-aacenc
    ./configure \
        --prefix=$PREFIX \
        --host=$ARCH-linux \
        --disable-dependency-tracking \
        --disable-shared \
        --enable-static \
        --with-pic \
        $ADDITIONAL_CONFIGURE_FLAG

    make clean
    make -j4 install
    make clean
    cd ..
    echo "FINISHED aac for $ARCH"
}
function build_freetype2
{
    echo "Starting build freetype2 for $ARCH"
    cd freetype2
    ./configure \
        --prefix=$PREFIX \
        --host=$ARCH-linux \
        --disable-dependency-tracking \
        --disable-shared \
        --enable-static \
        --with-pic \
        $ADDITIONAL_CONFIGURE_FLAG

    make clean
    make -j4 install
    make clean
    cd ..
    echo "FINISHED freetype2 for $ARCH"
}

function build_ass
{
    echo "Starting build ass for $ARCH"
    cd libass
    ./configure \
        --prefix=$PREFIX \
        --host=$ARCH-linux \
        --disable-fontconfig \
        --disable-dependency-tracking \
        --disable-shared \
        --enable-static \
        --with-pic \
        $ADDITIONAL_CONFIGURE_FLAG

    make clean
    make V=1 -j4 install
    make clean
    cd ..
    echo "FINISHED ass for $ARCH"
}
function build_fribidi
{
    echo "Starting build fribidi for $ARCH"
    cd fribidi
    ./configure \
        --prefix=$PREFIX \
        --host=$ARCH-linux \
        --disable-bin \
        --disable-dependency-tracking \
        --disable-shared \
        --enable-static \
        --with-pic \
        $ADDITIONAL_CONFIGURE_FLAG

    make clean
    make -j4 install
    make clean
    cd ..
    echo "FINISHED fribidi for $ARCH"
}
function build_ffmpeg
{
    echo "Starting build ffmpeg for $ARCH"
    cd ffmpeg
    ./configure --target-os=linux \
        --prefix=$PREFIX \
        --enable-cross-compile \
        --extra-libs="-lgcc -L$PREFIX/lib/libx264.a" \
        --arch=$ARCH \
        --cc=$CC \
        --cross-prefix=$CROSS_COMPILE \
        --nm=$NM \
        --sysroot=$PLATFORM \
        --extra-cflags=" -O3 -fpic -DANDROID -DHAVE_SYS_UIO_H=1 -Dipv6mr_interface=ipv6mr_ifindex -fasm -Wno-psabi -fno-short-enums  -fno-strict-aliasing -finline-limit=300 $OPTIMIZE_CFLAGS" \
        --disable-shared \
        --enable-static \
        --enable-runtime-cpudetect \
        --pkg-config-flags="--static" \
        --extra-ldflags="-Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib  -nostdlib -lc -lm -ldl -llog -L$PREFIX/lib" \
        --extra-cflags="-I$PREFIX/include" \
        --disable-everything \
        --enable-gpl \
        --enable-pthreads \
        --enable-libass \
        --enable-libvo-aacenc \
        --enable-libvo-amrwbenc \
        --enable-hwaccel=h264_vaapi \
        --enable-hwaccel=h264_vaapi \
        --enable-hwaccel=h264_dxva2 \
        --enable-hwaccel=mpeg4_vaapi \
        --enable-libx264 \
        --enable-demuxer=mov \
        --enable-demuxer=h264 \
        --enable-muxer=h264 \
        --enable-demuxer=mpegvideo \
        --enable-demuxer=h263 \
        --enable-demuxer=mpegps \
        --enable-demuxer=mjpeg \
        --enable-demuxer=rtsp \
        --enable-demuxer=rtp \
        --enable-demuxer=hls \
        --enable-demuxer=matroska \
        --enable-muxer=rtsp \
        --enable-muxer=mp4 \
        --enable-muxer=mov \
        --enable-muxer=mjpeg \
        --enable-muxer=matroska \
        --enable-protocol=crypto \
        --enable-protocol=jni \
        --enable-protocol=file \
        --enable-protocol=rtp \
        --enable-protocol=tcp \
        --enable-protocol=udp \
        --enable-protocol=applehttp \
        --enable-protocol=hls \
        --enable-protocol=http \
        --enable-decoder=xsub \
        --enable-decoder=jacosub \
        --enable-decoder=dvdsub \
        --enable-decoder=dvbsub \
        --enable-decoder=subviewer \
        --enable-decoder=rawvideo \
        --enable-encoder=rawvideo \
        --enable-decoder=mjpeg \
        --enable-encoder=mjpeg \
        --enable-decoder=h263 \
        --enable-decoder=mpeg4 \
        --enable-encoder=mpeg4 \
        --enable-decoder=h264 \
        --enable-encoder=h264 \
        --enable-decoder=aac \
        --enable-encoder=aac \
        --enable-parser=h264 \
        --enable-encoder=mp2 \
        --enable-decoder=mp2 \
        --enable-encoder=libvo_amrwbenc \
        --enable-decoder=amrwb \
        --enable-muxer=mp2 \
        --enable-bsfs \
        --enable-decoders \
        --enable-encoders \
        --enable-parsers \
        --enable-hwaccels \
        --enable-muxers \
        --enable-avformat \
        --enable-avcodec \
        --enable-avresample \
        --enable-zlib \
        --disable-doc \
        --disable-ffplay \
        --disable-ffmpeg \
        --disable-ffplay \
        --disable-ffprobe \
        --disable-ffserver \
        --enable-avfilter \
        --disable-avdevice \
        --disable-opencl \
        --enable-nonfree \
        --enable-version3 \
        --enable-memalign-hack \
        --enable-asm \
        $ADDITIONAL_CONFIGURE_FLAG
    make clean
    make -j4 install
    make clean

    cd ..
    echo "FINISHED ffmpeg for $ARCH"
}

function build_one {
    echo "Starting build one for $ARCH"
    cd ffmpeg
    ${LD} -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -L$PREFIX/lib  -soname $SONAME -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o $OUT_LIBRARY -lavformat -lavcodec -lavresample -lavutil -lswresample -lavfilter -lass -lfreetype -lfribidi -lswscale -lvo-aacenc -lvo-amrwbenc -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker -zmuldefs $PREBUILT/lib/gcc/$EABIARCH/$COMPILATOR_VERSION/libgcc.a
    cd ..
    echo "FINISHED one for $ARCH"
}

# enable additional architectures later on

#arm v5
#EABIARCH=arm-linux-androideabi
#ARCH=arm
#CPU=armv5
#OPTIMIZE_CFLAGS="-marm -march=$CPU"
#PREFIX=$(pwd)/ffmpeg-build/armeabi
#OUT_LIBRARY=$PREFIX/libffmpeg.so
#ADDITIONAL_CONFIGURE_FLAG=
#SONAME=libffmpeg.so
#PREBUILT=$ANDROID_NDK_HOME/toolchains/arm-linux-androideabi-$COMPILATOR_VERSION/prebuilt/$OS_ARCH
#PLATFORM_VERSION=android-5
#setup_paths
#build_amr
#build_aac
#build_fribidi
#build_freetype2
#build_ass
#build_ffmpeg
#build_one

#x86
#EABIARCH=i686-linux-android
#ARCH=x86
#OPTIMIZE_CFLAGS="-m32"
#PREFIX=$(pwd)/ffmpeg-build/x86
#OUT_LIBRARY=$PREFIX/libffmpeg.so
#ADDITIONAL_CONFIGURE_FLAG=--disable-asm
#SONAME=libffmpeg.so
#PREBUILT=$ANDROID_NDK_HOME/toolchains/x86-$COMPILATOR_VERSION/prebuilt/$OS_ARCH
#PLATFORM_VERSION=android-9
#setup_paths
#build_amr
#build_aac
#build_fribidi
#build_freetype2
#build_ass
#build_ffmpeg
#build_one

#mips
#EABIARCH=mipsel-linux-android
#ARCH=mips
#OPTIMIZE_CFLAGS="-EL -march=mips32 -mips32 -mhard-float"
#PREFIX=$(pwd)/ffmpeg-build/mips
#OUT_LIBRARY=$PREFIX/libffmpeg.so
#ADDITIONAL_CONFIGURE_FLAG="--disable-mips32r2"
#SONAME=libffmpeg.so
#PREBUILT=$ANDROID_NDK_HOME/toolchains/mipsel-linux-android-$COMPILATOR_VERSION/prebuilt/$OS_ARCH
#PLATFORM_VERSION=android-9
#setup_paths
#build_amr
#build_aac
#build_fribidi
#build_freetype2
#build_ass
#build_ffmpeg
#build_one

#arm v7vfpv3
EABIARCH=arm-linux-androideabi
ARCH=arm
CPU=armv7-a
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=$CPU "
PREFIX=$(pwd)/ffmpeg-build/armeabi-v7a
OUT_LIBRARY=$PREFIX/libffmpeg.so
ADDITIONAL_CONFIGURE_FLAG=
SONAME=libffmpeg.so
PREBUILT=$ANDROID_NDK_HOME/toolchains/arm-linux-androideabi-$COMPILATOR_VERSION/prebuilt/$OS_ARCH
PLATFORM_VERSION=android-5
setup_paths
build_x264
build_amr
build_aac
build_fribidi
build_freetype2
build_ass
build_ffmpeg
build_one

#arm v7 + neon (neon also include vfpv3-32)
EABIARCH=arm-linux-androideabi
ARCH=arm
CPU=armv7-a
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=neon -marm -march=$CPU -mtune=cortex-a8 -mthumb -D__thumb__ "
PREFIX=$(pwd)/ffmpeg-build/armeabi-v7a-neon
OUT_LIBRARY=../ffmpeg-build/armeabi-v7a/libffmpeg-neon.so
ADDITIONAL_CONFIGURE_FLAG=--enable-neon
SONAME=libffmpeg-neon.so
PREBUILT=$ANDROID_NDK_HOME/toolchains/arm-linux-androideabi-$COMPILATOR_VERSION/prebuilt/$OS_ARCH
PLATFORM_VERSION=android-9
setup_paths
build_x264
build_amr
build_aac
build_fribidi
build_freetype2
build_ass
build_ffmpeg
build_one


echo "BUILD SUCCESS"

I've disabled the non-arm architectures for the time being. 我暂时禁用了非手臂架构。 If there is any other information I can provide to help finding the problem, I will be happy to do so. 如果我能提供其他任何信息来帮助发现问题,我将很乐意这样做。

I'm wondering if the issue may be caused by something missing in the script, namely in build_one part, tho I tried to indicate the libx264.a directly in --extra-ldflags, without success. 我想知道问题是否可能是由于脚本中缺少某些内容引起的,即在build_one部分中,因此我试图直接在--extra-ldflags中指示libx264.a,但没有成功。

In build-one function, the command 构建一功能中,命令

${LD} -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -L$PREFIX/lib -soname $SONAME -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o $OUT_LIBRARY -lavformat -lavcodec -lavresample -lavutil -lswresample -lavfilter -lass -lfreetype -lfribidi -lswscale -lvo-aacenc -lvo-amrwbenc -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker -zmuldefs $PREBUILT/lib/gcc/$EABIARCH/$COMPILATOR_VERSION/libgcc.a $ {LD} -rpath-link = $ PLATFORM / usr / lib -L ​​$ PLATFORM / usr / lib -L ​​$ PREFIX / lib -soname $ SONAME -shared -nostdlib -Bsymbolic --whole-archive --no-undefined- o $ OUT_LIBRARY -lavformat -lavcodec -lavresample -lavutil -lswresample -lavfilter -lass -lfreetype -lfribidiidi -lswscale -lvo-aacenc -lvo-amrwbenc -lc -lm -lz -ldl -llog --dynamic-linker = / system / bin /链接器-zmuldefs $ PREBUILT / lib / gcc / $ EABIARCH / $ COMPILATOR_VERSION / libgcc.a

should also use -llx264 . 还应该使用-llx264

You mentioned that this library is already placed in $PLATFORM/lib . 您提到此库已经放在$ PLATFORM / lib中 With --whole-archive , the order of libraries should not matter, but to be on the safe side, place this enchantment immediately after -lavcodec . 使用--whole-archive ,库的顺序无关紧要,但是为了安全起见,请将此结界放在-lavcodec之后。 If you still have some link errors, the order of libraries may undergo fine tuning. 如果仍然存在一些链接错误,则库的顺序可能会进行微调。

Edit 编辑

As Krzysztof Kansy discovered, the library files should be listed explicitly, not with -l notation. 正如Krzysztof Kansy发现的那样,应该明确列出库文件,而不要使用-l表示法。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM