Windows下基于Visual Studio编译libharu

因为项目需要进行pdf输出,同时能很好的控制大小,于是选用李libharu。

网上都是源码,需要自己编译,参考了很多文章,最后都没成功,最后发现是编译zlib和libpng的原因。其实关键的地方就是预处理宏ZLIB_WINAPI的修改。

可以参考:

Window编译libharu及依赖库zlib和libpng

Windows下zlib库和libPng库的编译和使用

但是感觉还是没有说清libharu的编译问题。

从使用的角度来说,libharu可以有两种编译方式,一种是静态库的,一种是动态库的。静态库的就暂时不讨论了。主要说一下动态库的方式。

对于动态库而言,由于其依赖了zlib和libpng两个库,所以动态库的编译也有两种:

  1. libharu、zlib、libpng都编译为动态库,使用的时候这三个dll文件都得引入,才能运行成功。
  2. zlib、libpng编译为静态库,在编译libharu的时候把这些内容都编译到libharu.dll中,这样,项目引用的时候,就只需要引入编译好的libharu.dll,依赖的zlib和libpng的dll就不需要了。

网上一般采用的都是方法一。所以这里介绍一下方法二的编译。

先获得zlib和libpng的静态库:

  1. 编译zlib的静态库,打开zlib\contrib\vstudio目录下对应的vs版本sln。其中zlibstat工程用于编译静态库,注意在预处理器的定义中设置为:zlib_winapi,且代码生成的运行库选择为/MD。
  2. 编译libpng静态库,在libpng\projects\visualc71目录下,打开libpng.sln。其中,lib release模式是输出为静态库,注意:在预处理定义中和zlib保持一致;线程库选择为/MD;最关键的就是依赖的zlib库,最好选择第一步编译出来的zlib库,而不是用工程中配置的zlib项目去编译。

这样得到了zlib.lib和libpng.lib两个文件。

然后就是编译libharu

  1. 编译时依赖zlib.lib 和libpng.lib两个文件,设置好lib存放位置以及对应的h头文件位置,然后在script目录下的Makefile.msvc_dll文件,修改:PNG_PREFIX和 ZLIB_PREFIX,使得编译时,能找到相应的lib和h文件。
  2. 将CFLAGS添加宏定义,和zlib保持一致:/D "ZLIB_WINAPI" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_WARNINGS" /D "ASMV" /D "ASMINF"
  3. 将LDFLAGS中的libpng13.dll修改为libpng.dll
  4. 进入vs的命令提示控制台,进入的libharu目录,执行nmake -f script/Makefile.msvc_dll 这样就能得到包含了zlib和libpng代码的libharu.dll

通过这种方式,使用libharu的时候只需要一个libpng.dll就可以了,不再需要附加zlib和libpng两个dll文件。

需要注意的是,静态库生成的是lib文件,动态库生成时也有lib文件,这两个lib文件后缀一样,但是内容是不一样的。具体的区别,可百度静态库和动态库的区别。

猜你喜欢

转载自blog.csdn.net/felonyxce/article/details/80013689