ffmpeg链接第三方库,步骤看起来很简单,这里拿链接第三方库OpenSSL做示范:
1.定义宏
OPENSSL=`pwd`/openssl
2.configure裁剪配置增加支持选项(增加需要增加的选项)
CONFIGURE_FLAGS="....." #此处省略
#假设现在需要增加https的请求
if [ "$OPENSSL" ]; then
CONFIGURE_FLAGS="$CONFIGURE_FLAGS \
--enable-protocol=https \
--enable-openssl --enable-protocol=crypto --enable-protocol=tls_openssl"
fi
3.第三方系统库增加
CFLAGS="...."
LDFLAGS="..."
if [ "$OPENSSL" ];then
CFLAGS="$CFLAGS -I$OPENSSL_PATH/android/android-armeabi/include " 增加第三库头文件的路径,可能还需要增加对应的系统文件
LDFLAGS="$LDFLAGS -L${OPENSSL_PATH}/libs/android/android-armeabi/lib -lssl_topvdn -lcrypto_topvdn" 增加第三库的路径,可能还需要增加对应的系统库
fi
以上就是链接第三方的库的方法,但是问题出现了,我直接使用了同事编译好的OpenSSL,iOS顺利链接成功,但是android一直编译不过。
错误:"ERROR: openssl not found"
打开FFmpeg的日志文件config.log,看到报错如下:
从上面日志可以看出:
1) 使用ls命令查看路径根本不存在,这个路径不存在,但是根据我的./configure,我导入的路径都是对的,如下:
2)我导入的库名字明明是“-lssl_topvdn -lcrypto_topvdn”却找得是“-lssl -lcrypto”,后面找不到又开始找“-lssl32 -leay32”
3)而且最开始是使用“use_pkg_config”找函数“OPENSSL_init_ssl”和“SSL_library_init”
后来使用“check_lib”只找“SSL_library_init”
打开FFmpeg源码下的的configure程序,发现链接Openssl时:
1)库的名字只能是ssl和crypto,而我的是-lssl_topvdn -lcrypto_topvd,,所以暂时就把FFmpeg的configure修改一下:
2)通过check_lib只查找“SSL_library_init”,通过“use_pkg_config”既能查找“OPENSSL_init_ssl”又能“SSL_library_init”,为什么会有这种写法呢?
后来查找openssl资料发现:OpenSSL1.1.0之后的版本使用“OPENSSL_init_ssl”替代之前的“SSL_library_init”
因为我的库是同事之前编译好的,不记得是什么版本的,所以通过以下命令查看下版本号,顺便查看下二进制文件的符号化函数,验证一下,结果如下:版本为OpenSSL 1.1.0e,只在SSL里面找到“OPENSSL_init_ssl”
因为懒得重新编译OpenSSL,所以暂时修改FFmpeg的configure如下:
暂时不修改脚本,直接修改FFMpeg的configure,修改库名字和函数名字,因为我脚本里面是使用check_lib的方式导入库的,修改后如下:
最后编译成功。但是修改源码里面的东西不是最好的方法,所以最好的方法应该是:
1)关于库名字:最好编译出来的库,是“ssl crypto”,如果不是写脚本的时候,使用软链接指定,不要在FFmpeg里面的源码修改
2)关于函数名变更:导入第三方库使用pkg_config,这个需要有pkg文件,如下:
所以推荐做法
先自己编译好FFmpeg,生成如上lib:"libssl libcrypto"和pkgconfig文件
然后,:
1:export OpenSSL的pkgconfig
2:./config里面增加选项“-pkg-config=pkg-config”,一定要增加,否则还是会报错,还是找不到
./configure --help可以查看到这个选项目
--pkg-config=PKGCONFIG use pkg-config tool PKGCONFIG [pkg-config]
if [ "$OPENSSL" ]; then
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:${OPENSSL_PATH}/android/android-armeabi/lib/pkgconfig
CONFIGURE_FLAGS="$CONFIGURE_FLAGS \
--pkg-config=pkg-config"
echo $PKG_CONFIG_PATH
fi
网友评论