本文介绍的是目前 (写这篇文章时) 最新版本的 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 文件夹。
2. 用 C++ Builder 创建 dll 项目
选择菜单 File -> New -> Other...
在创建新项目里面,选择 Dynamic-Link Library,然后点击 OK 按钮:
这些按照默认的选项 (如上图所示),然后点击 OK 按钮,这样就创建了一个新的 dll 项目。
3. 把项目保存在源码的项目文件夹里面
选择菜单 File -> Save All,或者点击工具条上的 Save All 按钮,如下图所示:
在 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 项目文件 |
保存之后的项目如下图所示,注意红色箭头所示位置的文件名:
从文件夹里面查看保存的文件,这些项目文件都保存在 zint-2.7.1\C++ Builder\proj 文件夹里面了:
4. 添加源码文件
4.1. 添加 *.c 程序源码
在 C++ Builder 的项目管理里面,用鼠标右键点击 zint.dll,选择 Add...
选择 zint-2.7.1\backend 文件夹里面所有的 .c 文件:
点击上面截图的 Open 按钮,把选择的 .c 文件加入项目:
4.2 添加 *.rc 资源源码
在 C++ Builder 的项目管理里面,用鼠标右键点击 zint.dll,选择 Add...
选择 zint-2.7.1\backend 文件夹里面的 .rc 文件:
点击上面截图的 Open 按钮,把 libzint.rc 加入项目:
在项目管理界面里面可以找到 libzint.rc 文件。
三. 修改 zint.dll 项目的配置
1. 添加 Win64 平台选项
在项目管理里面,用鼠标右键点击 Target Platform,选择 Add Platform...
选择添加 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 编译器。
3.2. 选择资源编译器
- 左面的目录里面找到 Resource Compiler,
- 右面的 Target 选择 All configurations - All platforms;
Resource compiler to use 选择 Windows SDK Resource Compiler。
- 左面的目录里面选择 Resource Compiler 里面的 Directories and Conditionals,
- 右面的 Target 选择 All configurations - All platforms
用鼠标点击 Include file search path 选项最右面的 "..." 按钮:
在中间的编辑框里面输入 $(BDSINCLUDE)\windows\sdk 然后点击 Add 按钮,添加 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 选项的对钩。
4.2. 去除 C++ Builder 的 *.dll 动态运行库依赖,添加生成 .lib/.a 文件
- 左面的目录里面找到 C++ Linker;
- 右面的 Target 选择 All configuration - All platforms,
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 选项旁边的对钩;
以上所有参数都设置完成,点击这个项目设置窗口最底下的 OK 按钮,参数设置修改生效。修改设置之后别忘了存盘。
四. 编译 zint.dll 项目
编译 zint.dll 项目,生成 32 位 和 64 位的 zint.dll 文件,同时生成对应的 zint.lib 和 zint.a 文件
1. 编译 release 版本的 32 位 zint.dll 和 zint.lib
选择 Release 版本的 32-bit Windows 选项 (双击选中):
选择菜单 Project - Build zint 或快捷键 Shift + F9 开始编译。
屏幕底下的 Success 表示编译完成,点击屏幕中间的编译状态提示对话框的 OK 按钮结束。
编译提示有 2 个警告,这是由于源码里面判断了无符号整数≥0,这样的判断结果始终为 true 引起的,编译器认为没有必要做这个判断。
编译生成的文件在 zint-2.7.1\C++ Builder\dll\Win32 文件夹里面,包含 zint.lib 和 zint.dll。
2. 编译 release 版本的 64 位 zint.dll 和 zint.a
选择 Release 版本的 64-bit Windows 选项 (双击选中):
选择菜单 Project - Build zint 或快捷键 Shift + F9 开始编译。
屏幕底下的 Success 表示编译完成,点击屏幕中间的编译状态提示对话框的 OK 按钮结束。
编译提示有 2 个警告,这是由于源码里面判断了无符号整数≥0,这样的判断结果始终为 true 引起的,编译器认为没有必要做这个判断。
编译生成的文件在 zint-2.7.1\C++ Builder\dll\Win64 文件夹里面,包含 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,包含本文介绍的项目文件、编译完成的库文件。
相关链接:
- C++ Builder 生成二维码,使用本文介绍的 zint 库的例子程序。