文章

podofo 编译

podofo 编译

该文介绍 podofo 编译。

podofo 编译

1. Windows

1.1. 下载

1.1.1. 最新版本

Github:podofo/podofo: A C++17 PDF manipulation library

1.2. 环境

编译环境

VS2022 默认以 MSVC143 编译如果想要指定版本需要在 Visual Studio Install 下载对应的 MSVCVS2022 最低支持 VS2015 MSVC140,下图是下载 VS2017 MSVC141 的编译工具链。

Visual Studio 版本VC 版本(MSVC 版本)内部版本号(_MSC_VER)
Visual Studio 2022VC 17 (MSVC 14.3x)1930+ (e.g., 1931, 1932)
Visual Studio 2019VC 16 (MSVC 14.2x)1920+ (e.g., 1928, 1929)
Visual Studio 2017VC 15 (MSVC 14.1x)1910+ (e.g., 1911, 1916)
Visual Studio 2015VC 14 (MSVC 14.0)1900

1.3. 自定义 triplet

在根目录下创建 triplets/x86-windows-v142.cmake,该配置是下载 MSCV142 + 32 依赖库:

1
2
3
4
set(VCPKG_TARGET_ARCHITECTURE x86)
set(VCPKG_PLATFORM_TOOLSET v142)
set(VCPKG_CRT_LINKAGE dynamic)
set(VCPKG_LIBRARY_LINKAGE dynamic)

在根目录下创建 triplets/x64-windows-v143.cmake,该配置是下载 MSCV143 + 64 依赖库(VS2022默认):

1
2
3
4
set(VCPKG_TARGET_ARCHITECTURE x64)
set(VCPKG_PLATFORM_TOOLSET v143)
set(VCPKG_CRT_LINKAGE dynamic)
set(VCPKG_LIBRARY_LINKAGE dynamic)

需要在 vcpkg.json 中添加以下数据

1
2
3
4
5
"configuration": {
    "overlay-triplets": [
        "./triplets"
    ]
}

或者创建 vcpkg-configuration.json 添加以下数据

1
2
3
4
5
{
    "overlay-triplets": [
        "./triplets"
    ]
}

使用方式如下

# vcpkg
vcpkg install --triplet x86-windows-v142
vcpkg install --triplet x64-windows-v143

# cmake
cmake -D"VCPKG_TARGET_TRIPLET=x86-windows-v142"
cmake -D"VCPKG_TARGET_TRIPLET=x64-windows-v143"

1.4. 最新版编译

最新版目前在 Windows 上可以使用 vcpkg 管理依赖库。

首先按照 vcpkg快速入门 或者 vcpkg安装 设置软件包管理器存储库。 在 Windows 系统中,建议将环境变量 VCPKG_DEFAULT_TRIPLET 设置为 x64-windows 以便默认安装 64 位依赖项,并定义一个 VCPKG_ROOT 变量,指向快速入门指南中创建的存储库位置。

然后从根目录运行:

1
2
3
4
vcpkg install
mkdir build
cmake "-DCMAKE_TOOLCHAIN_FILE=vcpkg.cmake" -DCMAKE_BUILD_TYPE=Debug -B build
cmake --build build --config Debug

1.5. podofo0.9.8编译

1.5.1. 创建 vcpkg

如果需要编译 podofo0.9.8,从 github 发布版本下载 0.9.8 版本,需要依赖如下:

  • zlib
  • freetype2
  • fontconfig(仅限 Unix 和 Mac OS X)
  • libjpeg (可选)
  • libtiff(可选)
  • libpng(可选)
  • libidn(可选)
  • openssl(可选)

该版本没有 vcpkg.json 指定下载依赖,可以自己在代码根目录创建 vcpkg.json[^1], 如果电脑上只有 VS2022 还需要指定编译版本和位数,可以使用 triplets 自定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
{
    "name": "podofo",
    "version": "0.9.8",
    "description": "PoDoFo is a library to work with the PDF file format",
    "homepage": "https://github.com/podofo/podofo",
    "license": "LGPL-2.0-or-later",
    "configuration": {
        "overlay-triplets": [
            "./triplets"
        ]
    },
    "dependencies": [
        "pkgconf",
        "freetype",
        "libjpeg-turbo",
        "libpng",
        "libunistring",
        "openssl",
        "tiff",
        "zlib"
    ],
    "builtin-baseline": "56bb2411609227288b70117ead2c47585ba07713",
    "overrides": [
        {
            "name": "freetype",
            "version": "2.13.2"
        },
        {
            "name": "libjpeg-turbo",
            "version": "2.1.5"
        },
        {
            "name": "libpng",
            "version": "1.6.38"
        },
        {
            "name": "libunistring",
            "version": "1.1"
        },
        {
            "name": "openssl",
            "version": "1.1.1n"
        },
        {
            "name": "tiff",
            "version": "4.6.0"
        },
        {
            "name": "zlib",
            "version": "1.2.13"
        }
    ]
}

然后执行一下命令就会自动下载依赖并编译

1
2
3
4
5
# x86-windows-v142
cmake -B"build" -G"Visual Studio 17 2022" -A"Win32" -T"v142" -D"CMAKE_TOOLCHAIN_FILE=C:/dev/vcpkg/scripts/buildsystems/vcpkg.cmake" -D"VCPKG_TARGET_TRIPLET=x86-windows-v142" -D"CMAKE_INSTALL_PREFIX=D:/install/podofo0.9.8_32_v142"

# x64-windows-v143
cmake -B"build_64_v143" -G"Visual Studio 17 2022" -D"CMAKE_TOOLCHAIN_FILE=C:/dev/vcpkg/scripts/buildsystems/vcpkg.cmake" -D"VCPKG_TARGET_TRIPLET=x64-windows-v143" -D"CMAKE_INSTALL_PREFIX=D:/install/podofo0.9.8_64_v143"

1.5.2. 代码修改

1.5.2.1. freetype 链接失败

vcpkg 编译的 freetype 没有定义 ${FREETYPE_LIBRARIES} ${FREETYPE_INCLUDE_DIRS},所以找不到头文件和链接库,因为是默认编译动态库,所以修改 CMakeLists.txt287

1
2
# TARGET_LINK_LIBRARIES(podofo_shared ${PODOFO_LIB_DEPENDS}) 添加 Freetype::Freetype
TARGET_LINK_LIBRARIES(podofo_shared ${PODOFO_LIB_DEPENDS} Freetype::Freetype)
1.5.2.2. 测试程序常量未定义

测试程序中有日文,导致编译显示常量未定义,编译失败,在 test/CMakeLists.txt 第一行添加

1
add_compile_options("/utf-8")

1.6. 编译结果

头文件安装后提取,因为是动态链接,所以下面所有动态库需要在一起使用

可以看到指定编译出来的就是 MSVC14.29 + x86,查询依赖也都是该配置

参考

[^1]: [vcpkg.json 参考Microsoft Learn](https://learn.microsoft.com/zh-cn/vcpkg/reference/vcpkg-json)
本文由作者按照 CC BY 4.0 进行授权