libpng 静态编译教程
- W_Z_C
- 共 1207 字,阅读约 3 分钟
libpng 是 PNG 官方开发的参考库,它支持几乎所有 PNG 相关的特性,该库具有很强的扩展性,从开发到现在已经 23 年之久,可算是久经考验,不过在官方网页上仍然可以看到经常有漏洞的报告……,官方主页显示,当前的最新版本是 1.6.37 ,此版本修复了编号为 CVE-2019-7317 的一个 use-after-free bug。
本篇文章主要是介绍在 Windows 平台下,如何编译 libpng 的静态库。在开始之前,确认你的机器已经安装了 CMake 和 Visual Studio,如果你不知道怎样安装,可以查看 CMake 安装教程 和 Visual Studio 安装教程。
首先去 官网,下载最新的 libpng 源码包。
因为 libpng 需要以来 zlib 库,所以请确保你已经编译了静态版本的 zlib,具体的编译过程可以参考这篇文章:zlib 静态编译。
下载完成后,解压,找到 CMakeLists.txt 文件,用已经安装好的 CMake 软件打开,或者直接将该文件拖拽到 CMake 的 UI 界面上。在 Where to build the binaries
目录后面增加 _build
目录。这样可以确保生成的文件在 _build
目录中,而不会污染原有的 libpng 目录。
点击 Configure 按钮,生成配置信息,如果弹出新建 _build
目录确认的对话框,选择 Yes。
选择你想要编译的平台版本,这里使用 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_INCLUDE_DIR 表示 zlib 的头文件目录。
- ZLIB_LIBRARY_DEBUG 表示 zlib 的 Debug 库的位置。
- ZLIB_LIBRARY_RELEASE 表示 zlib 的 Release 库的位置。
这里因为静态库分为两个版本(MT 和 MD),请确保你的 Debug 和 Relase 选择库文件一致,我这里选择了 MT 的版本文件。
选好后,再次点击 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 而导致编译无法通过。