首先,打开 zlib 的源代码目录,你就会发现一个 CMakeList.txt。 是的,现在最新的 zlib 是支持使用 CMake 进行编译的。但是,我要给你泼一盆凉水,CMake 编译出来的 zlib,FFmpeg 并不能用。 所以,你需要按照以下的步骤,才能编出来一个 FFmpeg 能用的 zlib。
首先,我们不会选择使用 CMake 或者 configure 的方式进行编译(亲测都不好使), 在 zlib 源码目录里面,有这样一个文件 win32/Makefile.msc。 这是一个可以被 nmake 读取的构建文件,我们可以让 nmake 直接读取它,然后就可以编译了。 不过在开始之前,要对这个文件进行一些定制。
打开 win32/Makefile.msc 文件,在文件中大约 30 行左右的位置,有一行代码
CFLAGS = -nologo -MD -W3 -O2 -Oy- -Zi -Fd"zlib" $(LOC)
这行里面有个 -MD,将其修改成 -MT。(MSVC 里的 MD,MT 的区别我们有机会再讨论。)
改完这个还不够,我们还需要改另外一个文件。
打开 zconf.h 文件,这个文件的第 436 行,
#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */
这行代码表示,是否使用 unistd.h。这个文件是 Unix 专用的,在 Windows 下面是没有的。 zlib 的行为比较奇怪,它在编译的时候会去查找 unistd.h 是否存在,它也是找不到的,所以按理说编译脚本会重新生成一个 zconf.h 文件,里面把 unistd.h 给禁用掉。 但是在 Windows MSVC 下,这个功能是失灵的。所以需要我们手动关闭 unistd.h。 代码这样改:
#if 0 /* may be set to #if 1 by ./configure */
之后,就完成了 zlib 的改造,我们接下来用这行命令进行编译
nmake win32/Makefile.msc
编译后的产物会散落在 zlib 的文件夹里面,我们需要手动把这 zlib.h,zconf.h,zlib.lib,zlib1.dll 这几个文件给收集起来。
这个编译出来的 zlib,FFmpeg 就能正常使用了。