Visual Studio中使用开源二维码QR库libqr
分享一个轻巧的开源二维码QR库libqr,源码可以从GitHub上下载。下面我们详细说明一下如何在Visual Studio中编译使用。
1. 源码下载
地址:https://github.com/rsky/qrcode
可以使用git clone下载,也可以直接打包为zip文件下载。
2. 编译
该项目需要使用cmake编译,因此我们先下载cmake。
2.1 cmake下载
cmake可以从官网下载,为了避免设置环境变量的麻烦,我们直接下载安装包,安装的时候选择设置环境变量,然后就可以直接使用cmake命令了。
下载地址(截止目前,最新为3.9.1版本):
- 64位: https://cmake.org/files/v3.9/cmake-3.9.1-win64-x64.msi
- 32位: https://cmake.org/files/v3.9/cmake-3.9.1-win32-x86.msi
下载完成后直接安装就好了。注意选择设置环境变量。
然后在命令行中执行cmake命令,能正确执行则说明安装成功。否则需要手动在环境变量中添加cmake命令的路径。
2.2 编译qrcode库
进入qrcode库所在目录,在libqr文件夹下有个CMakeLists.txt文件,在编译之前我们先修改一下这个文件。
说明一下,该项目依赖于zlib库,因此没有zlib库的朋友需要先下载zlib库,可以去下载源码编译,也可以使用我已经编译好的库直接使用。
已编译好的库下载地址:https://pan.baidu.com/s/1nuErVtv
下载zlib库之后,我们先编辑CMakeLists.txt文件。
修改22-24行,替换为以下内容:
##############################################################################
#find_package(ZLIB)
#set my own zlib path
set (ZLIB_INCLUDE_DIRS "") #set in visual studio
set (ZLIB_LIBRARIES "") #set in visual studio
#add_definitions(-Wall -Wextra)
# Set default compile flags for GCC
if(CMAKE_COMPILER_IS_GNUCXX)
message(STATUS "GCC detected, adding compile flags")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++98 -pedantic -Wall -Wextra")
endif(CMAKE_COMPILER_IS_GNUCXX)
##############################################################################
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
主要意思是将zlib的引用目录设置为空(我们将在VS中编译时指定),同时根据系统编译环境指定编译参数。
然后打开cmd,进入到qrcode的libqr目录下,执行 cmake . 命令:
然后会生成VS的项目文件(.vcxproj)
我们打开libqr_shared.vcxproj编译一个DLL动态库。
设置预处理 QR_DLL_BUILD (如果是编译静态库项目libqr_static则设置为 QR_STATIC_BUILD)
设置我们之前下载的zlib库头文件和lib库目录(我放在qrcode项目下的include和lib目录里,注意Debug版本和Release版本的对应):
然后编译libqr_shared项目即可。
(注意,编译时可能会提示 error LNK2019: 无法解析的外部符号 _snprintf 错误,我们替换所有snprintf为_snprintf,vsnprintf为_vsnprintf就可以了。)
最终会在Debug或者Release目录下(看你编译的是debug还是release版本)生成qr.lib和qr.dll两个文件,然后就可以在其他项目中使用了。
3. 测试使用qrcode库
我们创建一个Test项目来测试qr库。代码如下:
#include <stdio.h>
#include <fstream>
#include "qr.h"
using namespace std;
int main()
{
int errcode = QR_ERR_NONE;
//qrInit的5个参数分别是version,mode,纠错等级和掩码,使用过程中使用除了QR_EM_8BIT以外的mode会生成不正常的二维码,暂时不知道原因。
QRCode* p = qrInit(10, QR_EM_8BIT, 2, -1, &errcode);
if (p == NULL)
{
printf("error\n");
return -1;
}
string strData = "百度一下,你就知道!";
qrAddData(p, (const qr_byte_t*)strData.data(), strData.length());
//注意需要调用qrFinalize函数
if (!qrFinalize(p))
{
printf("finalize error\n");
return -1;
}
int size = 0;
//两个5分别表示:像素之间的距离和二维码图片的放大倍数,范围都是1-16
qr_byte_t * buffer = qrSymbolToBMP(p, 5, 5, &size);
if (buffer == NULL)
{
printf("error %s", qrGetErrorInfo(p));
return -1;
}
ofstream f("qrcode.bmp");
f.write((const char *)buffer, size);
f.close();
return 0;
}
- 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
设置qrcode库头文件及lib库路径
编译后会生成test.exe文件,我们将以上两个dll(zlib.dll、qr.dll)文件放到test.exe目录下
执行test.exe即可生成qrcode.bmp的二维码文件。
以下为“百度一下,你就知道!”生成的二维码,大家可以扫一扫试试。
(参考: http://blog.csdn.net/a549875231/article/details/52048117)
上一篇: 372,二叉树的最近公共祖先
下一篇: P2053 [SCOI2007]修车