C++ Builder 编译 zint 库

本文介绍的是目前 (写这篇文章时) 最新版本的 zint 库 2.7.1 版本,经过测试,2.8.0 版本 zint 库使用本文介绍方法编译成功。
使用的 C++ Builder 版本 10.2.3。
编译之后的 zint.dll 和 zint.lib、zint.a 可以给其他版本 C++ Builder 使用 (低版本也可以用)。
使用这个库的例子程序请参考《C++ Builder 生成二维码》

  • 下载源码压缩包 zint-2.7.1.tar.gz / zint-2.8.0.tar.gz
  • 用 C++ Builder 创建 zint.dll 项目
  • 修改 zint.dll 项目的配置
  • 编译 zint.dll 项目
  • 发布 zint.dll
  • 下载本文的 zint 库 (包含项目文件和编译好了的库文件)

一. 下载源码压缩包 zint-2.7.1.tar.gz

在 sourceforge 的 zint 主页上直接点击 "Download Latest Version" 下载的是最新版本的 zint_x.x.x_win32.zip 这样的文件,是编译好了的 exe 文件,这不是我们需要的,我们需要的是源码,要点击 "Download" 进入下载页面,进入 zint 文件夹,里面是各个版本的文件夹,目前最新版本是 2.7.1,那么就进入 2.7.1 文件夹,下载里面的 zint-2.7.1.tar.gz 这个是源码压缩包

注:已经有 2.8.0 版本了,源码文件:zint-2.8.0.tar.gz,使用本文方法编译成功 (2020-05-07 测试并增加此备注)

二. 用 C++ Builder 创建 zint.dll 项目

1. 解压缩源码压缩包

zint-2.7.1.tar.gz 这个源码压缩包解压缩之后,是 zint-2.7.1 文件夹。

zint 源码:zint-2.7.1 文件夹

2. 用 C++ Builder 创建 dll 项目

选择菜单 File -> New -> Other...

创建新的 dll 项目

在创建新项目里面,选择 Dynamic-Link Library,然后点击 OK 按钮:

创建 dll 项目的选项

这些按照默认的选项 (如上图所示),然后点击 OK 按钮,这样就创建了一个新的 dll 项目。

3. 把项目保存在源码的项目文件夹里面

选择菜单 File -> Save All,或者点击工具条上的 Save All 按钮,如下图所示:

新创建的 dll 项目,需要保存到源码的项目文件夹里面

在 zint-2.7.1 里面创建 C++ Builder 文件夹,
再在这个 C++ Builder 文件夹里面创建 proj 文件夹,
项目文件都保存在 proj 文件夹里面。

新创建项目的文件名 保存为文件名 文件描述
File1.cpp zint_libmain.cpp dll 入口函数
Project1PCH1.h zintPCH1.h 预编译文件
Project1.cbproj zint.cbproj zint 项目文件
File1.cpp 改名为 zint_libmain.cpp
Project1PCH1.h 改名为 zintPCH1.h
Project1.cbproj 改名为 zint.cbproj

保存之后的项目如下图所示,注意红色箭头所示位置的文件名:

保存之后的 zint.dll 项目

从文件夹里面查看保存的文件,这些项目文件都保存在 zint-2.7.1\C++ Builder\proj 文件夹里面了:

这些项目文件都保存在 zint-2.7.1\C++ Builder\proj 文件夹里面了

4. 添加源码文件

4.1. 添加 *.c 程序源码

在 C++ Builder 的项目管理里面,用鼠标右键点击 zint.dll,选择 Add...

在项目里面添加源码文件:鼠标右键菜单

选择 zint-2.7.1\backend 文件夹里面所有的 .c 文件:

选择 zint-2.7.1\backend 里面的所有的 .c 文件

点击上面截图的 Open 按钮,把选择的 .c 文件加入项目:

加入 backend 文件夹里面的 .c 源码之后的项目管理界面

4.2 添加 *.rc 资源源码

在 C++ Builder 的项目管理里面,用鼠标右键点击 zint.dll,选择 Add...

在项目里面添加源码文件:鼠标右键菜单

选择 zint-2.7.1\backend 文件夹里面的 .rc 文件:

选择 zint-2.7.1\backend 文件夹里面的 libzint.rc 文件

点击上面截图的 Open 按钮,把 libzint.rc 加入项目:

添加到项目里面的 libzint.rc 文件

在项目管理界面里面可以找到 libzint.rc 文件。

三. 修改 zint.dll 项目的配置

1. 添加 Win64 平台选项

在项目管理里面,用鼠标右键点击 Target Platform,选择 Add Platform...

鼠标右键菜单:添加平台

选择添加 64-bit Windows:

选择添加 64-bit Windows

添加 64-bit Windows 之后,在项目管理里面可以看到:

项目管理里面可以看到 64-bit Windows

2. 设置编译输出路径和字符编码等

按照本文前所述,项目保存位置为 zint-2.7.1\C++ Builder\proj 文件夹,
如果希望把生成的 .lib、.a 和 .dll 放在 zint-2.7.1\C++ Builder\dll 文件夹,其中 32 位文件放在 zint-2.7.1\C++ Builder\dll\Win32 里面;64 位文件放在 zint-2.7.1\C++ Builder\dll\Win64 里面。

选择菜单 Project -> Options 打开项目选项:

项目的路径和字符编码等选项
  • 左面目录里面选择 C++ (Shared Options),
  • 右面的 Target 选择 All configurations - All platforms;
    BPI/LIB output 输入 ..\dll\$(Platform)
    Final output directory 输入 ..\dll\$(Platform)
    Conditional defines 输入 DLL_EXPORT;NO_PNG
    _TCHAR maps to 选择 wchar_t

在 C++ Builder 路径选项里面,$(Platform) 表示平台名称,"Win32" 或 "Win64" 等;这些路径都是相对于项目位置的,..\dll\$(Platform) 就是项目文件夹的上一级文件夹里面的 dll 文件夹里面的平台名称文件夹。

BPI/LIB output 是生成的 .lib 或 .a 文件存放的位置;
Final output directory 是生成的 .exe 或 dll 文件存放的位置;
这两个文件夹可以相同也可以不同,在编译的时候会自动创建。

Conditional defines 是预定义的宏,这里输入 DLL_EXPORT;NO_PNG 包含 2 个预定义的宏,用分号 ";" 隔开,其中:

  • DLL_EXPORT 是 zint 源码里面的参数,是 zint.dll 项目使用的,表示编译生成 dll 文件时导出给应用程序提供的函数;
  • NO_PNG 是 zint 源码里面的参数,表示不使用 libpng 库。C++ Builder 内置了 .png 图片处理,不需要调用这个库。如果需要调用 libpng 库,需要先安装 libpng,这里就省略这个步骤了。

_TCHAR maps to 是程序里面使用的字符编码,选择 wchar_t 表示使用 UNICODE 编码,选择 char 表示使用 ANSI 编码。

按照这个选项设置之后,将会是这样的文件夹结构:Win32 和 Win64 分别存放编译之后的 32 和 64 位的 .lib、.a 和 .dll 文件,dll、Win32 和 Win64 文件夹在编译的时候可以自动生成,没有必要在这里手动创建:

按照这个选项设置之后,将会是这样的文件夹结构

3. 选择编译器

仍然是前面选择菜单 Project -> Options 打开的项目选项:

3.1. 选择 C++ 编译器

  • 左面的目录里面找到 C++ Compiler,
  • 右面的 Target 选择 All configurations - All platforms;
    Use 'classic' Borland compiler 右面的对钩去掉 (即选择 false),这样就是使用 clang 编译器。
选择 C++ 编译器:去掉 Use 'classic' Borland compiler 选项的对钩

3.2. 选择资源编译器

  • 左面的目录里面找到 Resource Compiler,
  • 右面的 Target 选择 All configurations - All platforms;
    Resource compiler to use 选择 Windows SDK Resource Compiler。
资源编译器选择 Windows SDK Resource Compiler
  • 左面的目录里面选择 Resource Compiler 里面的 Directories and Conditionals,
  • 右面的 Target 选择 All configurations - All platforms
    用鼠标点击 Include file search path 选项最右面的 "..." 按钮:
Resource Compiler 的头文件路径
添加 $(BDSINCLUDE)\windows\sdk 路径

在中间的编辑框里面输入 $(BDSINCLUDE)\windows\sdk 然后点击 Add 按钮,添加 Windows SDK 的头文件的路径:

$(BDSINCLUDE)\windows\sdk 添加之后的状态

点击 OK 按钮让修改生效。

4. 生成独立的 dll,生成用于链接 dll 的 .lib/.a 文件

这个设置目的是为了生成的 dll 运行时不依赖 C++ Builder 的组件包和动态运行库。
仍然是前面选择菜单 Project - Options 的项目选项:

4.1. 去除 C++ Builder 的 *.bpl 组件包依赖

  • 左面目录里面找到 Runtime Packages,
  • 右面 Target 选择 All configuration - All platforms,
    去掉 Link with runtime pakcages 选项的对钩。
去掉 Link with runtime packages 选项的对钩

4.2. 去除 C++ Builder 的 *.dll 动态运行库依赖,添加生成 .lib/.a 文件

  • 左面的目录里面找到 C++ Linker;
  • 右面的 Target 选择 All configuration - All platforms,
    Generate import library 选项的对钩要选上;
    Link with Dynamic RTL 选项的对钩要去掉。
选择 Generate import library,去掉 Link with Dynamic RTL 选项的对钩

5. 版本信息

由于项目里面包含了 libzint.rc 这个资源文件,这个资源文件里面已经包含了 zint 的版本信息,这样就需要把项目设置里面的版本信息去掉:

  • 在项目设置里面,左面目录里面找到 Version Info。
    由于不同的平台有不同的版本信息,所以每个平台的选项都要设置:
  • 右面的 Target 选择 Debug configuration - 32-bit Windows platform,
    去掉 Include version information in project 选项旁边的对钩;
  • 右面的 Target 选择 Debug configuration - 64-bit Windows platform,
    去掉 Include version information in project 选项旁边的对钩;
  • 右面的 Target 选择 Release configuration - 32-bit Windows platform,
    去掉 Include version information in project 选项旁边的对钩;
  • 右面的 Target 选择 Release configuration - 64-bit Windows platform,
    去掉 Include version information in project 选项旁边的对钩;
去掉 Release configuration - 32 bit Windows platform 的版本信息
去掉 Release configuration - 64 bit Windows platform 的版本信息

以上所有参数都设置完成,点击这个项目设置窗口最底下的 OK 按钮,参数设置修改生效。修改设置之后别忘了存盘。

四. 编译 zint.dll 项目

编译 zint.dll 项目,生成 32 位 和 64 位的 zint.dll 文件,同时生成对应的 zint.lib 和 zint.a 文件

1. 编译 release 版本的 32 位 zint.dll 和 zint.lib

选择 Release 版本的 32-bit Windows 选项 (双击选中):

选择 Release 版本的 32-bit Windows

选择菜单 Project - Build zint 或快捷键 Shift + F9 开始编译。

选择菜单 Project - Build zint
等待编译
Release - 32-bit Windows 的 zint.dll 编译完成

屏幕底下的 Success 表示编译完成,点击屏幕中间的编译状态提示对话框的 OK 按钮结束。

编译提示有 2 个警告,这是由于源码里面判断了无符号整数≥0,这样的判断结果始终为 true 引起的,编译器认为没有必要做这个判断。

编译生成的文件在 zint-2.7.1\C++ Builder\dll\Win32 文件夹里面,包含 zint.lib 和 zint.dll。

编译生成的 32 位的 zint.dll 和 zint.lib

2. 编译 release 版本的 64 位 zint.dll 和 zint.a

选择 Release 版本的 64-bit Windows 选项 (双击选中):

选择 Release 版本的 64-bit Windows

选择菜单 Project - Build zint 或快捷键 Shift + F9 开始编译。

等待编译
Release - 64-bit Windows 的 zint.dll 编译完成

屏幕底下的 Success 表示编译完成,点击屏幕中间的编译状态提示对话框的 OK 按钮结束。

编译提示有 2 个警告,这是由于源码里面判断了无符号整数≥0,这样的判断结果始终为 true 引起的,编译器认为没有必要做这个判断。

编译生成的文件在 zint-2.7.1\C++ Builder\dll\Win64 文件夹里面,包含 zint.a 和 zint.dll。

编译生成的 64 位 zint.a 和 zint.dll

五. 发布 zint.dll

1. 发布给程序开发者,用于在程序里面调用 zint.dll

文件名 描述
zint.h 从 zint-2.7.1\backend 文件夹里面拷贝出来
zint.lib 和 zint.dll 选择 Win32 平台编译生成的
zint.a 和 zint.dll 选择 Win64 平台编译生成的

2. 发布给最终用户

文件名 描述
zint.dll 选择 Win32 平台编译生成的,放在 32 位 exe 相同文件夹里面
zint.dll 选择 Win64 平台编译生成的,放在 64 位 exe 相同文件夹里面

六. 下载本文的 zint 库

  • 请点击:zint-2.7.1-cbuilder,包含本文介绍的项目文件、编译完成的库文件。
  • 请点击:zint-2.8.0-cbuilder,包含本文介绍的项目文件、编译完成的库文件。

相关链接: