因为项目需要进行pdf输出,同时能很好的控制大小,于是选用李libharu。
网上都是源码,需要自己编译,参考了很多文章,最后都没成功,最后发现是编译zlib和libpng的原因。其实关键的地方就是预处理宏ZLIB_WINAPI的修改。
可以参考:
Window编译libharu及依赖库zlib和libpng
Windows下zlib库和libPng库的编译和使用
但是感觉还是没有说清libharu的编译问题。
从使用的角度来说,libharu可以有两种编译方式,一种是静态库的,一种是动态库的。静态库的就暂时不讨论了。主要说一下动态库的方式。
对于动态库而言,由于其依赖了zlib和libpng两个库,所以动态库的编译也有两种:
- libharu、zlib、libpng都编译为动态库,使用的时候这三个dll文件都得引入,才能运行成功。
- zlib、libpng编译为静态库,在编译libharu的时候把这些内容都编译到libharu.dll中,这样,项目引用的时候,就只需要引入编译好的libharu.dll,依赖的zlib和libpng的dll就不需要了。
网上一般采用的都是方法一。所以这里介绍一下方法二的编译。
先获得zlib和libpng的静态库:
- 编译zlib的静态库,打开zlib\contrib\vstudio目录下对应的vs版本sln。其中zlibstat工程用于编译静态库,注意在预处理器的定义中设置为:zlib_winapi,且代码生成的运行库选择为/MD。
- 编译libpng静态库,在libpng\projects\visualc71目录下,打开libpng.sln。其中,lib release模式是输出为静态库,注意:在预处理定义中和zlib保持一致;线程库选择为/MD;最关键的就是依赖的zlib库,最好选择第一步编译出来的zlib库,而不是用工程中配置的zlib项目去编译。
这样得到了zlib.lib和libpng.lib两个文件。
然后就是编译libharu
- 编译时依赖zlib.lib 和libpng.lib两个文件,设置好lib存放位置以及对应的h头文件位置,然后在script目录下的Makefile.msvc_dll文件,修改:PNG_PREFIX和 ZLIB_PREFIX,使得编译时,能找到相应的lib和h文件。
- 将CFLAGS添加宏定义,和zlib保持一致:/D "ZLIB_WINAPI" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_WARNINGS" /D "ASMV" /D "ASMINF"
- 将LDFLAGS中的libpng13.dll修改为libpng.dll
- 进入vs的命令提示控制台,进入的libharu目录,执行nmake -f script/Makefile.msvc_dll 这样就能得到包含了zlib和libpng代码的libharu.dll
通过这种方式,使用libharu的时候只需要一个libpng.dll就可以了,不再需要附加zlib和libpng两个dll文件。
需要注意的是,静态库生成的是lib文件,动态库生成时也有lib文件,这两个lib文件后缀一样,但是内容是不一样的。具体的区别,可百度静态库和动态库的区别。