libpng 是 PNG 官方开发的参考库,它支持几乎所有 PNG 相关的特性,该库具有很强的扩展性,从开发到现在已经 23 年之久,可算是久经考验,不过在官方网页上仍然可以看到经常有漏洞的报告……,官方主页显示,当前的最新版本是 1.6.37 ,此版本修复了编号为 CVE-2019-7317 的一个 use-after-free bug。

本篇文章主要是介绍在 Windows 平台下,如何编译 libpng 的静态库。在开始之前,确认你的机器已经安装了 CMake 和 Visual Studio,如果你不知道怎样安装,可以查看 CMake 安装教程Visual Studio 安装教程

首先去官网,下载最新的 libpng 源码包。

libpng 官网

因为 libpng 需要以来 zlib 库,所以请确保你已经编译了静态版本的 zlib,具体的编译过程可以参考这篇文章:zlib 静态编译

下载完成后,解压,找到 CMakeLists.txt 文件,用已经安装好的 CMake 软件打开,或者直接将该文件拖拽到 CMake 的 UI 界面上。在 Where to build the binaries 目录后面增加 _build 目录。这样可以确保生成的文件在 _build 目录中,而不会污染原有的 libpng 目录。

cmake GUI

点击 Configure 按钮,生成配置信息,如果弹出新建 _build 目录确认的对话框,选择 Yes。

cmake build

选择你想要编译的平台版本,这里使用 vs2019 编译 x64 位的静态库。

选择编译平台

点击 Finish,CMake 会自动识别当前系统的配置信息,并生成相关的配置文件。在执行一半的时候,CMake 可能会弹出配置文件的错误信息:

配置错误

查看日志就可以发现,错误的原因是没有找到 zlib 相关的库文件:

Selecting Windows SDK version 10.0.18362.0 to target Windows 10.0.18363.
The C compiler identification is MSVC 19.24.28315.0
The ASM compiler identification is MSVC
Found assembler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.24.28314/bin/Hostx64/x64/cl.exe
Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.24.28314/bin/Hostx64/x64/cl.exe
Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.24.28314/bin/Hostx64/x64/cl.exe -- works
Detecting C compiler ABI info
Detecting C compiler ABI info - done
Detecting C compile features
Detecting C compile features - done
CMake Error at C:/Program Files/CMake/share/cmake-3.16/Modules/FindPackageHandleStandardArgs.cmake:146 (message):
  Could NOT find ZLIB (missing: ZLIB_LIBRARY ZLIB_INCLUDE_DIR)
Call Stack (most recent call first):
  C:/Program Files/CMake/share/cmake-3.16/Modules/FindPackageHandleStandardArgs.cmake:393 (_FPHSA_FAILURE_MESSAGE)
  C:/Program Files/CMake/share/cmake-3.16/Modules/FindZLIB.cmake:115 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  CMakeLists.txt:42 (find_package)


Configuring incomplete, errors occurred!
See also "C:/projects/lpng1637/_build/CMakeFiles/CMakeOutput.log".
See also "C:/projects/lpng1637/_build/CMakeFiles/CMakeError.log".

解决的方法,就是添加 zlib 库的相关信息。点击 CMake 界面上的 Advanced 复选框,找到 ZLIB 开头的三个宏定义信息,如图:

zlib 配置

三个宏定义含义如下:

  • ZLIB_INCLUDE_DIR 表示 zlib 的头文件目录。
  • ZLIB_LIBRARY_DEBUG 表示 zlib 的 Debug 库的位置。
  • ZLIB_LIBRARY_RELEASE 表示 zlib 的 Release 库的位置。

这里因为静态库分为两个版本(MT 和 MD),请确保你的 Debug 和 Relase 选择库文件一致,我这里选择了 MT 的版本文件。

zlib 信息

选好后,再次点击 Configure 按钮。

配置重新生成

配置已经 OK,点击 Generate 按钮生成解决方案,完毕后,点击 OpenProject 打开工程。

工程目录

解决方案中 png 可编译动态库,png_static 可以编译静态库,这里我们需要静态库,所以直接编译 png_static 即可。但是按照 Debug/Release 和 /MT 以及 /MD 之分,至少可以组合四种配置,所以我们分别选择不同的配置属性,生成最后的四种库文件,并将它们放到不同的目录下。具体的配置方法可以查看 运行时库详解 这篇文章,每次修改配置都编译一次工程,编译成功后,将生成的结果放到一开始设定的目录下,最后的目录结构如下:

---
 |--- include //放头文件
 |--- lib
       |--- Debug
       |      |--- MDd
       |      |     |-- libpng16_staticd.lib
       |      |
       |      |--- MTd
       |            |-- libpng16_staticd.lib
       |
       |--- Release
              |--- MD
              |     |-- libpng16_static.lib
              |
              |--- MT
                    |-- libpng16_static.lib

为了方便这里我打包了最后的结果,方便大家直接使用,不过这里只有 x64 版本,如果你的机器还是 32 位系统则无法使用。libpng 静态库下载

这里有一点注意,在 include 头文件的目录里面需要加入 CMake 生成的 pnglibconf.h 文件,这个文件默认生成在 _build/pnglibconf.h 里面,如果忘记这个头文件,在使用 libpng 库的时候,可能会无法找到 pnglibconf.h 而导致编译无法通过。

求关注