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,包含本文介绍的项目文件、编译完成的库文件。

相关链接:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352