QZXing 的编译和使用
QZxing 是对 zxing 的一个封装,用于在 Qt 程序中加入条形码和二维码识别的功能。这里就讲讲如何编译和使用这个库。
前几年 QZXing 的代码是放到 sourceforge.net 上的,现在迁移到了 github.com。所以下载最新的代码要去:http://https://github.com/ftylitak/qzxing/
可以用git 来下载,也可以直接下载打包的 zip 文件。下载下来有 150M 左右,里面主要是有很多测试图片,真正的代码其实并不多。
下载解压之后里面有个 src 目录。里面就是我们需要的代码了。
我用的是 Win10 + VS2015 + Qt5.9.1
可以用 Qtcreator 打开 QZXing.pro,或者直接:
qmake QZXing.pro
nmake
直接编译会报错:
zxing\zxing\qrcode\encoder\MaskUtil.cpp(89): error C2039: “max”: 不是“std”的成员
D:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\iostream(12): note: 参见“std”的声明
zxing\zxing\qrcode\encoder\MaskUtil.cpp(89): error C3861: “max”: 找不到标识符
zxing\zxing\qrcode\encoder\MaskUtil.cpp(90): error C2039: “min”: 不是“std”的成员
D:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\iostream(12): note: 参见“std”的声明
zxing\zxing\qrcode\encoder\MaskUtil.cpp(90): error C3861: “min”: 找不到标识符
zxing\zxing\qrcode\encoder\MaskUtil.cpp(101): error C2039: “max”: 不是“std”的成员
D:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\iostream(12): note: 参见“std”的声明
zxing\zxing\qrcode\encoder\MaskUtil.cpp(101): error C3861: “max”: 找不到标识符
zxing\zxing\qrcode\encoder\MaskUtil.cpp(102): error C2039: “min”: 不是“std”的成员
D:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\iostream(12): note: 参见“std”的声明
zxing\zxing\qrcode\encoder\MaskUtil.cpp(102): error C3861: “min”: 找不到标识符
大概的意思就是不认识 std::min 和 std::max。
出这个错是因为代码中忘记包含这两函数所在的头文件了。在 MaskUtil.cpp 的开头加一行:
#include <algorithm>
再编译就没有问题了。成功的生成dll 和对应的 lib 文件。为了使用方便,我将 QZXing.pro 做了点小的修改:
TARGET = x86_QZXing
这样改之后生成的 dll 和 lib 文件的名字是:
- x86_QZXing2.dll
- x86_QZXing2.lib
这样改是为了与 64 位的库文件区别。有了这两个文件,我们还需要两个头文件:
- QZXing.h
- QZXing_global.h
QZXing readme.md 文件中给的例子是这样的:
#include <QZXing.h>
int main(int argc, char *argv[])
{
QImage imageToDecode("d:/file.png");
QZXing decoder;
decoder.setDecoder( DecoderFormat_QR_CODE | DecoderFormat_EAN_13 );
QString result = decoder.decodeImage(imageToDecode);
}
这个例子编译也会报错,需要做一点小修改:
#include <QZXing.h>
int main(int argc, char *argv[])
{
QImage imageToDecode("d:/file.png");
QZXing decoder;
decoder.setDecoder( QZXing::DecoderFormat_QR_CODE | QZXing::DecoderFormat_EAN_13 );
QString result = decoder.decodeImage(imageToDecode);
}
上面的介绍中省略了如何在 qt 项目中加入第三方的库,如果用 qtcreator 那么很简单,右键弹出菜单中点选 添加库,然后按照提示一步步操作就可以了。这块就不多介绍了。
总体来说 QZXing 的安装和使用都很简单,但是 QZXing 的作者提供的代码和文档有点小错误,直接编译通不过,所以我才写了这篇博客,帮大家快速的搭建起这个库来。