前情提要:上篇已经把libavutil库编译通过,只是还有84个链接错误,曙光已现,成功在即!
一、libavutil编译
本篇主要解决链接错误,翻看了下链接错误类型,绝大多数是ff开头的,先解决其他的!
问题15:无法解析的外部符号 mkstemp,函数 avpriv_tempfile 中引用了该符号
追踪了下代码,该函数是在file_open.c中调用:
通过搜索,mkstemp函数在windows并不存在,所以网上(c++ - mkstemp() implementation for win32 - Stack Overflow)有个方案是从wcecompat中找到该函数,作为windows的替代方案。或者也有说用_mktemp来替代的,但是都需要改代码,先不考虑。其实再往前翻看,有一个宏定义HAVE_MKSTEMP对此做了判断,我们只需要将该宏设置为0即可解决该问题。
注:另外还有两个链接错误:nanosleep和usleep,把相应的宏定义HAVE_NANOSLEEP和HAVE_USLEEP设置为0即可。
问题16:无法解析的外部符号 BCryptOpenAlgorithmProvider
经查证,该函数属于windows下,链接不上是因为没有包含相应的lib库,通过微软官网(BCryptOpenAlgorithmProvider 函数 (bcrypt.h) - Win32 apps | Microsoft Learn),查获应该包含的lib库叫Bcrypt.lib,直接将其添加到工程,该问题解决。
接下来就全剩下ff开头的链接错误了,看了下数量为79个。
问题17:无法解析的外部符号 ff_image_copy_plane_uc_from_sse4
仔细查看了源代码,其实ff_image_copy_plane_uc_from_sse4在imgutils_init.c中有定义,但没有实现:
这应该是链接失败的原因,继续查看汇编代码,即imgutils.asm中存在以下代码:
与刚才的函数定义是类似的,但为什么链接不上呢?
回头看了下编译输出,发现在链接错误之前还有类似:warning LNK4042: 对象被多次指定;已忽略多余的指定的警告信息六条,有点醍醐灌顶,是否因为多个同名的obj文件产生了冲突,导致链接失败呢?如果是这个原因,解决起来就简单了,把相应的asm编译中间结果换个名字就可以了。具体改名涉及以下文件:float_dsp.asm、imgutils.asm、lls.asm、tx_float.asm、fixed_dsp.asm、pixelutils.asm六个文件:
将输出的obj文件添加个_asm标识以示区分即可。然后清理一下,重新生成,大功告成,哈哈哈哈。
下一个目标就是libavcodec,加油!