Poppler库在VS2019下编译成静态库

Poppler库是网上为数不多的可以渲染PDF文件的C++开源库,主要针对Linux和安卓平台,看它的C++文件后缀名是.cc就很清楚了,在windows下Visual Studio中使用有一定困难,但也不是此路不通,编译成静态库比动态库难度又要大一点,因为Poppler需要一些依赖库,有的库在windows下编译有陷阱,我就在这些依赖库的编译上耽误了很长时间。

为了编译Poppler库这里先从整体上交代一下大概的步骤:

  1. 去Poppler官网(https://poppler.freedesktop.org/)下载最新版Poppler库poppler-24.04.0.tar.xz,网上有一些文章还用的是poppler-0.xx.x的版本,太古老了。
  2. 去cmake官网(https://cmake.org/)下载最新的cmake-3.29.1.zip。poppler-24.04.0.tar.xz解压缩后其根目录下有CMakeLists.txt这个文件,需要我们用cmake-gui来配置编译CMakeLists.txt,然后生成vs2019的项目文件poppler.sln。
  3. 下载Poppler的依赖库大概有以下这么多,这是我用的版本:CairoLib,freetype-2.13.0,jpeg-9f,lcms2,libpng-1.6.37,openjpeg-version.2.1,StaticLibiconv117,tiff-4.5.0,zlib-1.2.13,以上这些库最好在vs2019下编译成静态库,代码生成用MT,保证以后程序的运行速度。此外还需要boost_1_84_0,这个库不需要编译,随便放在一个逻辑磁盘的根目录下就好。另外还需要vcpkg这个软件,cmake-gui需要找到vcpkg.exe可执行文件,当然你也可以用vcpkg来下载上面的依赖库,但我没有这么干,怕有无数的幺蛾子飞出来。把上述各个依赖库编译成静态库会遇到很多奇奇怪怪的问题,等你打通关了,你已经从一个编译菜鸟变成一个熟手。当然你也可以编译成动态库版本,代码生成用MD,至于Debug版本个人认为没有必要,第一我没有水平去调试这些乱七八糟的库,能用就用,不能用就换一个,第二Debug版本在运行时比Release版要慢很多。
  4. 解压缩poppler-24.04.0.tar.xz,我放在N:\Poppler_Lib里面,把解压后的vcpkg也放在这里。在这里建一个DependMT目录,这是我建的名称,你也可以自己命名它。将第3条里面完成的库分别按它们的名称在DependMT目录下再建一个子目录,把编译好的库文件和所有的头文件也拷贝进来。
  5. 解压缩cmake-3.29.1.zip,然后运行里面的bin\cmake-gui.exe。在where is the source code里填上poppler-24.04.0.tar.xz解压缩的目录,我的是N:\Poppler_Lib\poppler-24.04.0,

            在where to build binaries里填上N:\Poppler_Lib\poppler-24.04.0\build。

         到这里准备工作基本完成,开始享受痛苦的编译过程。

      6、vs2019项目文件poppler.sln生成以后,我们需要在解决方案里编译3个项目poppler,poppler-cpp和poppler-render,第三个项目如果编译通过,那么恭喜你大功告成了。

 在使用cmake-gui生成poppler.sln工程文件过程中会不断出现各种错误,可能每个人的情都不一样,需要仔细查看软件下面出现各种配置错误警告,然后见招拆招,一一化解,直到最后出现Configuring done。如果你的英文水平差点意思,就算查字典也要弄个明明白白,否则完不了活。

       接着上面第5条,点击cmake-gui下面configure按钮,马上出现第一个错误:

Unsupported CMAKE_BUILD_TYPE,这是什么鬼?根据上面一行的提示,错误在popplermacros.cmake文件的第91行,用VScode打开这个文件删除90到92行,然后保存,再回到cmake-gui点击configure按钮,这条错误就没有了,然后继续配置工作,就这样一步一步直到看到Configuring done。最后别忘了点击Generate按钮,这样就可以在build目录下找到poppler的vs2019工程了。

上面的过程中还有一个问题,报错如下:Your libjpeg is too old. Poppler needs one that provides jpeg_mem_src. That is provided in libjpeg >= 8 or libjpeg-turbo >= 1.1.0. You can                       also decide to use the internal unmaintained DCT decoder or none at all.                        
Possible options are: -DENABLE_DCTDECODER=libjpeg, -DENABLE_DCTDECODER=none, 
-DENABLE_DCTDECODER=unmaintained                                                                                  

我指定了正确的jpeg库但是cmake-gui认为我的版本太低,至少要8.0,可我的版本是9f,这找谁说理去?只能到Cmakefilelists.txt里185到190行注释掉,规避这个错误。

poppler.sln解决方案生成后用vs2019打开,里面有十来个项目,最有用的就是poppler、poppler-cpp和poppler-render这三个项目,前面两个是库,后面一个是应用程序,在编译这几个项目时还会遇到一些错误,

一、编译poppler库时会有 error C2371: “INT32”: 重定义;不同的基类型       这个错误需要打开Libjpeg库的头文件jmorecfg.h,将第216行的typedef long INT32改成typedef long INT32B       

二、编译poppler-render时 如果碰到找不到_imp_开头的函数,那么就有点麻烦,那是因为这些函 数因为某些预处理命令或其它原因没有编译到前面提到的静态的依赖库里来,请回头重新编译那个有问题的静态库。                      

        编译poppler-render这个项目的意义是为了抄它的代码。poppler::image这个类和CImage类很相似,里面的StretchBlt和CImage类里的同名函数用法一模一样,可以在MFC程序里直接将图像绘制到窗口。

       poppler-render这项目是用不到cairo库的,这个库编译起来也很麻烦,也需要自己的依赖库。poppler居然没有用cairo库来渲染PDF文件的路径对象,这让我感到很意外,cairo库既开源性能又相当给力为嘛不用呢?poppler性能不佳也许与此有关。cairo库在pdftocairo项目中有用到。

      跟其它能渲染PDF的开源库相比,poppler的优点在于可以在不生成磁盘文件的情况下直接将PDF里的任意页面显示出来,其它方面就乏善可陈了。缺点是渲染速度奇慢,72dpi的图都要搞好久;图像的色彩空间只有RGB,不支持色彩管理;除了反走样几乎没有其它的功能。总而言之,poppler库仅适合一般要求的应用场景,不具备生产力。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值