windows 利用 cygwin 编译 ffmpeg 生成.so

时间:2024-05-21 07:16:01

1.老泪纵横,终于编译出.so 文件了。遇到了非常多的坑,好在坚持下来了,虽然资料不是很多但是还是有一些可以查到的。

1)windows 下 执行.sh 脚本,网上有很多其他的,但是我用的cygwin ,不用全部下载下来。 安装cygwin:https://www.cnblogs.com/CharlesGrant/p/4763571.html 我只选了这里面列出的项目,里面匹配不精确的我把相关的都打勾了。然后就是测试 g-- --version gcc --version,这里有个坑,部分不是 -version 而是 --version.

2)深坑:ndk 版本的问题,ndk18以后 gcc从ndk 里面移除了,当你执行的时候会报 gcc 找不到,如果你使用17以前的版本又会出现其他bug,具体参见 https://juejin.im/entry/5c6fc79a6fb9a049b82b1310。所以直接下载17 的吧!!我是先19不行,换15 不行,换17的编译出来了,当然17也有17的坑。

3).sh 文件执行错误。直接下载notepad++,改格式成unix.这里还有就是不要随便删除换行,不同的ndk版本脚本也有可能不同,不要迷信任何脚本!

#!/bin/bash
export TMPDIR="D:/Personal/ffmpeg/temp"
NDK="E:/AndroidStudio/android-ndk-r17c"
SYSROOT=$NDK/platforms/android-16/arch-arm/
TOOLCHAIN="E:/AndroidStudio/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64"
CPU=arm
PREFIX="D:/Personal/ffmpeg/simplefflib"
ADDI_CFLAGS="-marm"

function build_one
{
./configure \
--prefix=$PREFIX \
--enable-shared \
--enable-postproc \
--enable-gpl \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-doc \
--disable-symver \
--enable-small \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=android \
--arch=arm \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-I$NDK/sysroot/usr/include/arm-linux-androideabi -isysroot $NDK/sysroot -fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -marm -march=armv7-a" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
}

build_one

4)执行的时候如果设置了 TMPDIR 执行的时候提示找不到,不用管它,会正常进行的,还有pkg-config 找不到的warning 也不影响的

5)linux-androideabi/bin/ld.exe: error: libavutil/libavutil.so: not an object or archive   collect2.exe: error: ld returned 1 exit status

其他类似错误参见:https://www.veryarm.com/8401.html

 修改configure文件:

android)
disable symver
enable section_data_rel_ro
SLIB_INSTALL_NAME='$(SLIBNAME)'
SLIB_INSTALL_LINKS=
SHFLAGS='-shared -Wl,-soname,$(SLIBNAME)'
;;
linux)
enable dv1394
enable section_data_rel_ro
;;
----> 增加ln_s="cp -f"
android)
disable symver
enable section_data_rel_ro
ln_s="cp -f"
SLIB_INSTALL_NAME='$(SLIBNAME)'
SLIB_INSTALL_LINKS=
SHFLAGS='-shared -Wl,-soname,$(SLIBNAME)'
;;
linux)
ln_s="cp -f"
enable dv1394
enable section_data_rel_ro

 6)修改生成的so 名称,参见:https://blog.****.net/leixiaohua1020/article/details/47008825

windows 利用 cygwin 编译 ffmpeg 生成.so

windows 利用 cygwin 编译 ffmpeg 生成.so

总结:大概花了接近一周才编译出来,因为网上流传的大多已经过时了,而ffmpeg 却是不停的在更新,ndk也是,以前博主的文章现在已经有些不适用了,网上又是各种抄袭,杂乱,很难确定谁说的对,浪费了非常多的时间!