PDFium库在Windows平台的编译与优化
1. 引言
PDFium是一个开源的PDF渲染引擎,由Google开发并维护。本文旨在提供一个全面的指南,介绍如何在Windows平台上编译PDFium动态库,并解决编译过程中可能遇到的问题。
2. 环境准备
2.1 xx上网工具
由于PDFium源码托管在Google服务器上,需要确保能够访问 https://pdfium.googlesource.com/pdfium/
。
2.2 安装depot_tools
depot_tools是Chromium项目开发使用的一套工具集。按照官方指南安装,并将其添加到系统环境变量中。
2.3 Visual Studio环境
截至2017年9月(R503915),PDFium要求至少使用Visual Studio 2017 (15.7.2)版本。需要安装以下组件:
- "Desktop development with C++" 组件
- "MFC and ATL support" 子组件
- Windows 10 SDK (版本10.0.17134)
- SDK Debugging Tools
可以通过Visual Studio安装程序或命令行安装这些组件:
--add Microsoft.VisualStudio.Workload.NativeDesktop
--add Microsoft.VisualStudio.Component.VC.ATLMFC --includeRecommended
3. 获取源码
执行以下命令获取PDFium源码:
mkdir repo
cd repo
gclient config --unmanaged https://pdfium.googlesource.com/pdfium.git
gclient sync
4. 编译过程
4.1 生成GN构建文件
进入PDFium根目录并执行以下命令:
cd pdfium
set DEPOT_TOOLS_WIN_TOOLCHAIN=0
gn args out/Release64
在打开的args.gn
文件中,添加以下配置:
use_goma = false
is_debug = false
pdf_use_skia = false
pdf_use_skia_paths = false
pdf_enable_xfa = true
pdf_enable_v8 = true
pdf_is_standalone = true
is_component_build = false
clang_use_chrome_plugins = false
target_cpu="x64"
4.2 执行构建
使用ninja执行构建动作:
ninja -C out\Release64 pdfium
5. 解决导出函数名问题
在编译32位库时可能会遇到导出函数名非C风格的问题。解决方法如下:
- 打开
pdfium\public\fpdfview.h
文件。 - 将以下代码:
#ifdef FPDFSDK_EXPORTS
# if defined(_WIN32)
# define FPDF_EXPORT __declspec(dllexport)
# define FPDF_CALLCONV __stdcall
# else
# define FPDF_EXPORT __attribute__((visibility("default")))
# define FPDF_CALLCONV
# endif
#else
# if defined(_WIN32)
# define FPDF_EXPORT __declspec(dllimport)
# define FPDF_CALLCONV __stdcall
# else
# define FPDF_EXPORT
# define FPDF_CALLCONV
# endif
#endif
替换为:
#if defined(FPDFSDK_EXPORTS)
#ifdef _WIN32
#define FPDF_EXPORT __declspec(dllexport)
#else
#define FPDF_EXPORT __attribute__ ((visibility("default")))
#endif
#else
#ifdef _WIN32
#define FPDF_EXPORT __declspec(dllimport)
#else
#define FPDF_EXPORT __attribute__ ((visibility("default")))
#endif
#endif
#define FPDF_CALLCONV
- 重新执行GN构建和ninja构建过程。
6. 验证
编译完成后,可以使用 dumpbin -exports pdfium.dll
命令检查导出函数名是否正确。
7. 结论
通过以上步骤,我们成功在Windows平台上编译了PDFium动态库,并解决了32位库导出函数名的问题。这个优化后的过程应该能够满足大多数开发者的需求。
8. 注意事项
- 本文基于2018年9月的信息,随着时间推移,某些细节可能需要调整。
- 官方对x86平台的支持可能不如x64完善,在选择目标平台时需要考虑这一点。
- 在遇到问题时,建议查阅最新的官方文档,因为PDFium项目可能会不断更新其构建要求和过程。