windows下编译poppler过程
站长推荐: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语句如下
- #include <sys/types.h>
- #include <sys/stat.h>
- #ifndef WIN32
- #include <unistd.h>
- #endif
- #include <stdarg.h>
1 2 3 4 5 6 |
#include <sys/types.h> #include <sys/stat.h> #ifndef WIN32 #include <unistd.h> #endif #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文件,找到发生冲突的地方
- #ifndef XMD_H /* X11/xmd.h correctly defines INT32 */
- #ifndef _BASETSD_H_ /* Microsoft defines it in basetsd.h */
- #ifndef QGLOBAL_H /* Qt defines it in qglobal.h */
- typedef long INT32;
- #endif
- #endif
- #endif
1 2 3 4 5 6 7 |
#ifndef XMD_H /* X11/xmd.h correctly defines INT32 */ #ifndef _BASETSD_H_ /* Microsoft defines it in basetsd.h */ #ifndef QGLOBAL_H /* Qt defines it in qglobal.h */ typedef long INT32; #endif #endif #endif |
在此段代码之前加上#include<windows.h>即可解决这个问题。
第五个错误:..\..\utils\pdftocairo.cc(666) : error C3861: ‘strcasecmp’: identifier not found
找到出错的地方:
- if (p && strcasecmp(p, “.pdf”) == 0) {
- GooString *name2 = new GooString(name->getCString(), name->getLength() – 4);
- delete name;
- name = name2;
- }
1 2 3 4 5 |
if (p && strcasecmp(p, ".pdf") == 0) { GooString *name2 = new GooString(name->getCString(), name->getLength() - 4); delete name; name = name2; } |
这个函数的功能是忽略大小写比较,在string.h中,但是明明已经包含了string.h,没办法,只能换一个比较方式了,改成了
p&&(!strcmp(p, “.pdf”) || !strcmp(p, “.PDF”))
再次编译工程,提示成功。
说明一点,以上错误只不过是我在编译的时候遇到的,在其他机器上未必会遇到这些问题,也有可能会遇到一些其他问题,这就需要具体问题具体对待了,不过我相信遇到的问题就会有解决的办法。
做个测试,利用编译生成的test-poppler-qt4.exe打开pdf文件(注意要将poppler,openjpeg,libpng等的dll即动态链接库所在文件夹,一般是bin文件夹加入到环境变量中):
虽然很麻烦,过程也很漫长,不过最后看到运行结果还是很值得的。
学习日记,兼职软件设计,软件修改,毕业设计。
本文出自 学习日记,转载时请注明出处及相应链接。
本文永久链接: https://www.softwareace.cn/?p=351
一条评论
http://wenku.baidu.com/view/2e4bb2d950e2524de5187e5d.html