前言:在前几篇文章已经介绍了,如何进行编译ffmpeg.so的一个完整过程。但是编译出的是7个独立模块的so文件,使用起来较为不便。本文将在上一篇文章的基础上进行so的合并介绍。
ffmpeg专辑(一):linux编译ffmpeg.so入门
ffmpeg专辑(二):linux编译ffmpeg.so脚本改良与裁编
ffmpeg专辑(三):linux编译ffmpeg.so多架构编译
ffmpeg专辑(四):linux编译ffmpeg.so合并so篇
ffmpeg专辑(五):android使用ffmpeg.so
一、编写脚本
注意:本文所述依然是双架构编译,但所谓合并so,并不是合并两个架构的so,而是分别在自己的架构下,进行多个ffmpeg的.a静态库合并成动态库so的过程。即本文两个架构来说,这个过程进行了2次。
在前几篇文章中的ffmpeg-4.2.2源码目录下新建一个编译脚本:build_android_v8v7_comileso.sh:
#!/bin/bash
make clean
API=21
NDK=/home/liuzihui/softwaresCus/ndkr21/android-ndk-r21e
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
SYSROOT=$TOOLCHAIN/sysroot
ADDITIONAL_CONFIGURE_FLAG="--enable-avdevice --enable-avcodec --enable-avformat --enable-swresample --enable-swscale --enable-postproc --enable-avfilter"
function build_android {
echo "===========================1========================"
./configure \
--prefix=$OUTPUT \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--enable-asm \
--enable-neon \
--enable-cross-compile \
--disable-shared \
--enable-static \
--disable-doc \
--disable-ffplay \
--disable-ffprobe \
--disable-symver \
--disable-ffmpeg \
--sysroot=$SYSROOT \
--cross-prefix=$CROSS_PREFIX \
--cc=$CC \
--cxx=$CXX \
--extra-cflags="-fPIC" \
$ADDITIONAL_CONFIGURE_FLAG
echo "===========================2====================="
make clean
echo "=============================${CC}==============="
make -j4
make install
$COMBILE_TOOLCHAIN_LD \
-rpath-link=$COMBILE_PLATFORM/usr/lib \
-L$COMBILE_PLATFORM/usr/lib \
-L$OUTPUT/lib \
-soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o \
$OUTPUT/libffmpeg.so \
libavcodec/libavcodec.a \
libavfilter/libavfilter.a \
libswresample/libswresample.a \
libavformat/libavformat.a \
libavutil/libavutil.a \
libavdevice/libavdevice.a \
libswscale/libswscale.a \
-lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \
$COMBILE_TOOLCHAIN_GCC
}
#arm64-v8a
ARCH=arm64
CPU=armv8-a
CPU_INSTRUCT_COMMON=aarch64-linux-android
OUTPUT=/home/liuzihui/softwaresCus/ffmpegSource/ffmpeg-4.2.2/android/$CPU
CROSS_PREFIX=$TOOLCHAIN/bin/$CPU_INSTRUCT_COMMON- #AR AS LD等通用
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang #CC单独指定,非通用(因为ndk中CC与AR路径不同,后同理)
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++ #CXX单独指定,非通用
COMBILE_PLATFORM=$NDK/platforms/android-$API/arch-arm64 #
COMBILE_TOOLCHAIN_LD=$NDK/toolchains/$CPU_INSTRUCT_COMMON-4.9/prebuilt/linux-x86_64/bin/$CPU_INSTRUCT_COMMON-ld
COMBILE_TOOLCHAIN_GCC=$NDK/toolchains/$CPU_INSTRUCT_COMMON-4.9/prebuilt/linux-x86_64/lib/gcc/$CPU_INSTRUCT_COMMON/4.9.x/libgcc.a
build_android
#armeabi-v7a
ARCH=arm
CPU=armv7-a
CPU_INSTRUCT_COMMON=arm-linux-androideabi
OUTPUT=/home/liuzihui/softwaresCus/ffmpegSource/ffmpeg-4.2.2/android/$CPU
CROSS_PREFIX=$TOOLCHAIN/bin/$CPU_INSTRUCT_COMMON- #AR AS LD等通用
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang #CC单独指定,非通用
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++ #CXX单独指定,非通用
COMBILE_PLATFORM=$NDK/platforms/android-$API/arch-arm
COMBILE_TOOLCHAIN_LD=$NDK/toolchains/$CPU_INSTRUCT_COMMON-4.9/prebuilt/linux-x86_64/bin/$CPU_INSTRUCT_COMMON-ld
COMBILE_TOOLCHAIN_GCC=$NDK/toolchains/$CPU_INSTRUCT_COMMON-4.9/prebuilt/linux-x86_64/lib/gcc/$CPU_INSTRUCT_COMMON/4.9.x/libgcc.a
build_android
说明:
1、思路是用 –disable-shared –enable-static 先生成7个.a(静态库),然后再利用脚本合并成一个so;
2、在合并so方面,我们在 make install后面追加了一些脚本,虽然ndk17以后在编译ffmpeg.so使用clang,但是合并so这块,适用性更强的gcc在这里派上了用场。
3、-L指定了合并so最终生成的地方,演示项目里(对于armv8a架构来说)是:/home/liuzihui/softwaresCus/ffmpegSource/ffmpeg-4.2.2/android/armv8-a/lib
二、执行脚本
在前几篇文章中的ffmpeg-4.2.2源码目录下,终端命令:赋予脚本权限和执行脚本:
chmod +x build_android_v8v7_comileso.sh
./build_android_v8v7_comileso.sh
等待几分钟,然后会在ffmpeg-4.2.2源码目录下自动生成android目录和里面的内容:
好了,本次专辑(四)就讲到这里了,更多内容,请期待下次的讲述
欢迎有问题的伙伴及时留意讨论,有不足之处还望指正
祝大家生活工作愉快~
转自:
https://blog.csdn.net/minping9101/article/details/131758937