[续]Win10 + WSL编译FFmpeg开启openssl依赖时的坑

之前写过一篇基于WSL编译windows版FFmpeg的博文:使用Win10 + WSL编译FFmpeg时的依赖库处理 – https://blog.k-res.net/archives/2771.html,记录了一些基本构建操作和一些问题,但是当时的configure并没有开启很多其他依赖项来激活相关功能,这次要记录的是通过开启openssl的方式,增加如https,rtmps等协议的支持,虽然有WSL的加持,大大简化了windows下编译FFmpeg的复杂度,但到了某些依赖,如这次要说的openssl时,还是有些需要注意的地方的,毕竟WSL的方式实际的本质是在一个同时有linux命令但又能执行windows执行程序的特殊环境下执行构建操作,带来方便的同时也带来了一些特有的麻烦:

首先,说下windows下的openssl构建,官方wiki上说明比较详细,可以参考:https://wiki.openssl.org/index.php/Compilation_and_Installation,核心就是安装perl,nasm等,然后执行config脚本生成makefile,然后nmake构建即可,虽然不像cmake这类跨平台构建工具这么方便,但不需要linux命令环境也不是很麻烦,参考如下:

perl ..\Configure VC-WIN64A --release --prefix=f:\openssl --openssldir=f:\openssl no-tests
nmake all
nmake install
nmake clean

然后参考之前的FFmpeg WSL构建说明,configure增加 –enable-openssl,然后即可踩到本次要说的主坑,configure的时候会报找不到openssl的pkgconfig问题,本以为和正经linux构建一样,由于openssl的安装prefix路径并没有在系统默认路径,加上类似PKG_CONFIG_PATH=/mnt/f/openssl/lib/pkgconfig这样的环境变量就可以了,一试发现居然没有效果,仔细一看,发现大坑所在,原来openssl在windows下编译构建时根本不会像*nix系统那样生成.pc文件,但是咱们的ffmpeg又是在*nix环境下使用configure脚本来生成makefile的,这样就很尴尬了,虽然参考上篇博文,.pc并没有起实际作用,include和lib都是通过configure时手动指定cflags,ldflags加上正确路径的,但是由于前置configure脚本开关各种功能的必要性,又不得不执行,纠结很久,最后想出了临时解决方案,即在WSL中先按照openssl的dev包(apt install libssl-dev,不像红帽系叫openssl-devel),这样系统默认pkgconfig路径中就有了linux版的openssl相关pc文件,虽然里面的内容都是错的,但是不用在意这些细节,ffmpeg的configure已经可以顺利通过检查了!

然后,大坑出来后,紧接着还有一个小坑,虽然configure里的pkgconfig存在性检查通过上面的骚操作通过了,但是由于ffmpeg的configure中还存在这样的检查:

enabled openssl           && { check_pkg_config openssl openssl openssl/ssl.h OPENSSL_init_ssl ||
                               check_pkg_config openssl openssl openssl/ssl.h SSL_library_init ||
                               check_lib openssl openssl/ssl.h OPENSSL_init_ssl -lssl -lcrypto ||
                               check_lib openssl openssl/ssl.h SSL_library_init -lssl -lcrypto ||
                               check_lib openssl openssl/ssl.h SSL_library_init -lssl32 -leay32 ||
                               check_lib openssl openssl/ssl.h SSL_library_init -lssl -lcrypto -lws2_32 -lgdi32 ||
                               die "ERROR: openssl not found"; }

此时,会发现另一个openssl在windows上构建的蜜汁操作,生成的.lib都带了lib前缀,比如configure脚本里检查的ssl.lib和crypto.lib,实际生成的是libssl.lib和libcrypto.lib,这就又尴尬了,反正我找了半天也没找到openssl的Configure脚本里有什么东西能控制这种prefix行为的,一时也没找到怎么能修改脚本去掉这个前缀,于是,还是改了下ffmpeg的configure,在上面位置加了一行:“check_lib openssl openssl/ssl.h OPENSSL_init_ssl -llibssl -llibcrypto ||”,多了一种选择,至此,openssl依赖就可以顺利打开,ffmpeg也可以成功构建带openssl功能的版本了。

博主友情提示:

如您在评论中需要提及如QQ号、电子邮件地址或其他隐私敏感信息,欢迎使用>>博主专用加密工具v3<<处理后发布,原文只有博主可以看到。