windows下编译poppler过程

作者: admin 分类: Qt Gui 发布时间: 2013-04-15 13:59 ė4,150 浏览数 61条评论
文章转自王牌软件
站长推荐:NSetup一键部署软件
一键式完成美化安装包制作,自动增量升级,数据统计,数字签名。应对各种复杂场景,脚本模块化拆分,常规复杂的脚本代码,图形化设置。无需专业的研发经验,轻松完成项目部署。(www.nsetup.cn)

windows平台下因为在做界面程序中需要显示pdf文件,查询相关资源决定用poppler库来实现,只能从网上得到源代码,需要自己编译生成lib,dll文件,因为它用到很多库,最麻烦的就是编译过程。

平台:windows    编译工具:VS2008

一步一步来吧,从网上下载poppler源代码:http://poppler.freedesktop.org/,我的是poppler-0.18.4

利用CMake来生成VS2008工程,在CMake中需要配置的库都有:CAIRO,FREETYPE,ICONV,JPEG,LCMS,LIBOPENJPEG,PNG,QT,TIFF,ZLIB

我的电脑已经有了FREETYPE(2.4.2),JPEG(未知),PNG(未知),QT(4.7.2),TIFF(未知),ZLIB(未知),还需要CAIRO,ICONV,LCMS,LIBOPENJPEG

1、CMake第1次Configure会提示生成什么工程,选择VC9即可,先配置FreeType库

 

2、第2次Configure后,需要配置的库都会显示出来,CMake必须在Advanced条件下

 

下面开始一个一个配置

CAIRO:

http://cairographics.org/官网上可以看到它的编译过程,但是太麻烦了。直接下载编译好的库,根据提示找到链接:http://www.gtk.org/download/win32.php

在这里可以看到想要的库文件,记得下载Dev的。

下载cairo的库文件即可。版本是1.10.2

ICONV

下载地址:http://gnuwin32.sourceforge.net/packages/libiconv.htm,注意要下载安装文件,安装完成后,在安装目录中找它的库文件。版本是1.9.2。

LCMS

下载地址:http://sourceforge.net/projects/lcms/files/lcms/,注意一点,要下载的版本是lcms1-19,若下载最新版lcms2的话,在生成VS工程编译是会发生找不到lcms.h的错误。解压后,找到Projects文件夹中的VC2008,直接打开sln解决方案编译即可,编译会发生错误,但不用管它,主要的lib文件已经编译出来了。就在Lib文件夹的MS文件夹中。

LIBOPENJPEG

下载地址:http://code.google.com/p/openjpeg/downloads/list,下载win32版本的压缩包即可。版本是1.5.0。

 

3、将以上的库文件在CMake中配置好的,第3次Configure成功,然后Generate。打开生成的VS2008工程,Build Solution,会出现警告和错误,先不必管警告。接下来一个一个排除错误。

第一个错误:链接错误poppler.lib(PNGWriter.obj) : error LNK2001: unresolved external symbol _png_init_io

应该是PNG库的问题,去官网上http://www.libpng.org/pub/png/libpng.html下载了一个最新版的PNG源代码(1.5.10),发现它也能用CMake来生成VS工程,需要配置zlib库,如下图:

生成工程后直接打开编译,即可生成libpng库。

 

4、在poppler的CMake中重新配置PNG库,第4次Configure,Generate。再次编译poppler工程,之前的错误消失,这个错误就是PNG库版本的问题。

第二个错误:D:\dependLib\cairo\include\cairo\cairo-ft.h(50) : fatal error C1083: Cannot open include file: ‘fontconfig/fontconfig.h’: No such file or directory

缺少fontconfig支持,去下载cairo的地址下载fontconfig(2.8.0),重新配置CMake,在CMake中没有关于fontconfig的配置,而在poppler工程中出现此编译错误的地方可看出是cairo库需要这个头文件。所以在CMake中直接配置cairo的头文件目录即可:

 

5、第5次Configure,然后Generate。编译poppler工程,错误解决,但又出现新的错误。

第三个错误:D:\dependLib\fontconfig\include\fontconfig/fontconfig.h(30) : fatal error C1083: Cannot open include file: ‘unistd.h’: No such file or directory
原来在fontconfig.h文件中,包含了一个unistd.h头文件,网上查询相关信息后知道这个头文件是UNIX/LINUX系统中的,Windows系统中没有这个文件,没办法只得修改源代码了,在包含unistd.h处加了ifndef语句如下

 

  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #ifndef WIN32
  4. #include <unistd.h>
  5. #endif
  6. #include <stdarg.h>

编译,错误解决。

 

 

第四个错误:C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\basetsd.h(78) : error C2371: ‘INT32′ : redefinition; different basic types                                 d:\dependlib\3rdparty_vs2008\include\jmorecfg.h(164) : see declaration of ‘INT32′

看了一下这两个文件basetsd.h和jmorecfg.h,这两个文件里都定义了INT32,发生了冲突。修改jmorecfg.h文件,找到发生冲突的地方

 

  1. #ifndef XMD_H            /* X11/xmd.h correctly defines INT32 */
  2. #ifndef _BASETSD_H_        /* Microsoft defines it in basetsd.h */
  3. #ifndef QGLOBAL_H        /* Qt defines it in qglobal.h */
  4. typedef long INT32;
  5. #endif
  6. #endif
  7. #endif

在此段代码之前加上#include<windows.h>即可解决这个问题。

 

 

第五个错误:..\..\utils\pdftocairo.cc(666) : error C3861: ‘strcasecmp’: identifier not found

找到出错的地方:

 

  1. if (p && strcasecmp(p, “.pdf”) == 0) {
  2.   GooString *name2 = new GooString(name->getCString(), name->getLength() – 4);
  3.   delete name;
  4.   name = name2;
  5. }

这个函数的功能是忽略大小写比较,在string.h中,但是明明已经包含了string.h,没办法,只能换一个比较方式了,改成了

 

p&&(!strcmp(p, “.pdf”) || !strcmp(p, “.PDF”))

再次编译工程,提示成功。

 

说明一点,以上错误只不过是我在编译的时候遇到的,在其他机器上未必会遇到这些问题,也有可能会遇到一些其他问题,这就需要具体问题具体对待了,不过我相信遇到的问题就会有解决的办法。

 

做个测试,利用编译生成的test-poppler-qt4.exe打开pdf文件(注意要将poppler,openjpeg,libpng等的dll即动态链接库所在文件夹,一般是bin文件夹加入到环境变量中):

 

虽然很麻烦,过程也很漫长,不过最后看到运行结果还是很值得的。



只回答业务咨询点击这里给我发消息 点击这里给我发消息

王牌软件,兼职软件设计,软件修改,毕业设计。

本文出自 王牌软件,转载时请注明出处及相应链接。

本文永久链接: http://www.softwareace.cn/?p=351

一条评论

  1. admin 2013 年 4 月 15 日 下午 2:12 回复

    http://wenku.baidu.com/view/2e4bb2d950e2524de5187e5d.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">


Ɣ回顶部

无觅相关文章插件,快速提升流量