1. 程式人生 > >libqrencode庫編譯及使用

libqrencode庫編譯及使用

libqrencode庫

libqrencode是一個日本人寫的生成二維碼的可以跨平臺的c庫,官網是這裡,Github在這裡
在C++裡當然也是可以使用的,但問題是官網上沒仔細說明怎麼使用這個庫,花了幾個小時研究了下,記錄下來。

平臺

WIN10 + VS15 + MFC dialog

步驟

  1. 從官網或者Github上fork下原始碼
  2. VS裡新建一個專案QRtest,對話方塊模式,選擇在靜態庫中使用MFC
  3. 在解決方案資源管理器裡右鍵解決方案,新增–新建專案–Win32專案,取名libQR–選擇靜態庫,同時取消預編譯,結果如圖

  1. 選出libqrencode裡所有.h .c
    檔案新增到libQR工程裡去,注意排除掉qrenc.c這個檔案,這個檔案是用來說明怎麼呼叫這個庫的
  2. 右鍵libQR工程c++–前處理器–前處理器定義裡新增HAVE_CONFIG_H,常規–目標檔名改為$(ProjectName)d,這樣生成的debug的lib檔名為libQRd.lib,用來區分release下的lib
  3. 開啟split.c檔案,修改裡面的strdup為全部mystrdup,不修改的話會和標準庫裡的strdup混淆
  4. 到此libqrencode就完成編譯設定了,F7之後便能看到QRtest下的Debug資料夾裡便有libQRd.lib檔案
  5. 到工程QRtest裡,QRtestDlg.h
    裡寫下面的程式碼並宣告一個函式void QRCode(void);
#if _DEBUG
#pragma comment(lib, "..\\Debug\\libQRd.lib")
#else
#pragma comment(lib, "..\\Release\\libQR.lib")
#endif

#include "..\libQR\qrencode.h"
  1. QRtestDlg.cpp裡完成程式碼
void CBarCodeTestDlg::QRCode(void)
{
    char*           szSourceSring = "1255335584";
    unsigned
int unWidth, x, y, l, n, unWidthAdjusted, unDataBytes; unsigned char* pRGBData, *pSourceData, *pDestData; QRcode* pQRC; FILE* f; if (pQRC = QRcode_encodeString(szSourceSring, 0, QR_ECLEVEL_H, QR_MODE_8, 1)) { unWidth = pQRC->width; unWidthAdjusted = unWidth * 8 * 3; if (unWidthAdjusted % 4) unWidthAdjusted = (unWidthAdjusted / 4 + 1) * 4; unDataBytes = unWidthAdjusted * unWidth * 8; // Allocate pixels buffer if (!(pRGBData = (unsigned char*)malloc(unDataBytes))) { exit(-1); } // Preset to white memset(pRGBData, 0xff, unDataBytes); // Prepare bmp headers BITMAPFILEHEADER kFileHeader; kFileHeader.bfType = 0x4d42; // "BM" kFileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + unDataBytes; kFileHeader.bfReserved1 = 0; kFileHeader.bfReserved2 = 0; kFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); BITMAPINFOHEADER kInfoHeader; kInfoHeader.biSize = sizeof(BITMAPINFOHEADER); kInfoHeader.biWidth = unWidth * 8; kInfoHeader.biHeight = -((int)unWidth * 8); kInfoHeader.biPlanes = 1; kInfoHeader.biBitCount = 24; kInfoHeader.biCompression = BI_RGB; kInfoHeader.biSizeImage = 0; kInfoHeader.biXPelsPerMeter = 0; kInfoHeader.biYPelsPerMeter = 0; kInfoHeader.biClrUsed = 0; kInfoHeader.biClrImportant = 0; // Convert QrCode bits to bmp pixels pSourceData = pQRC->data; for (y = 0; y < unWidth; y++) { pDestData = pRGBData + unWidthAdjusted * y * 8; for (x = 0; x < unWidth; x++) { if (*pSourceData & 1) { for (l = 0; l < 8; l++) { for (n = 0; n < 8; n++) { *(pDestData + n * 3 + unWidthAdjusted * l) = 0xff; *(pDestData + 1 + n * 3 + unWidthAdjusted * l) = 0; *(pDestData + 2 + n * 3 + unWidthAdjusted * l) = 0; } } } pDestData += 3 * 8; pSourceData++; } } // Output the bmp file if (!(fopen_s(&f, "temp.bmp", "wb"))) { fwrite(&kFileHeader, sizeof(BITMAPFILEHEADER), 1, f); fwrite(&kInfoHeader, sizeof(BITMAPINFOHEADER), 1, f); fwrite(pRGBData, sizeof(unsigned char), unDataBytes, f); fclose(f); } else { printf("Unable to open file"); exit(-1); } // Free data free(pRGBData); QRcode_free(pQRC); } else { printf("NULL returned"); exit(-1); } }
  1. QRtest工程右鍵屬性–連結器–輸入–忽略特定預設庫輸入msvcrtd.lib
  2. QRtestDlg.cppOnInitDialog()函式最後呼叫上面的函式QRCode();
  3. 如果是在release模式下,同樣需要新增HAVE_CONFIG_H,以及第10步需要忽略特定預設庫輸入msvcrt.lib

完成

執行之後程式資料夾下便有temp.bmp檔案生成了,用手機二維碼掃描可以正確識別

相關推薦

libqrencode編譯使用

libqrencode庫 libqrencode是一個日本人寫的生成二維碼的可以跨平臺的c庫,官網是這裡,Github在這裡。 在C++裡當然也是可以使用的,但問題是官網上沒仔細說明怎麼使用這個庫,花了幾個小時研究了下,記錄下來。 平臺 WIN10

cmake編譯檔案的步驟和檔案結構,dlib開源的ubuntu共享編譯使用

一、cmake的工作機制         使用CMake很簡單。 構建過程是通過建立一個或多個CMakeLists檔案(實際上是CMakeLists.txt,但本指南將在大多數情況下脫離擴充套件)控制在專案的每個目錄中。 CMakeLists檔案應該包含CMake簡單語言的

C#類編譯使用

 1 using System; 2 using System.Data.SqlClient; 3  4  5 publicclass DataReaderSql 6   { 7 publicstaticint Main(string[] args) 8   { 9 string        source 

configure配置詳解,動靜態編譯Cmake配置

       最近在配置mapserver一整套環境,本來動態庫好好地,老闆讓搞成一個檔案,得,那基本就是靜態庫了,靜態庫合併看我發的另一個文章有說,本篇光說動靜態庫編譯。        編譯是依靠配置configure的各個屬性來配置的,一般常用的基本也就 prefix(

ubuntu下dlib編譯C++(共享使用,即cmake編譯dlib開原始檔的步驟和檔案結構,

一、cmake的工作機制         使用CMake很簡單。 構建過程是通過建立一個或多個CMakeLists檔案(實際上是CMakeLists.txt,但本指南將在大多數情況下脫離擴充套件)控制在專案的每個目錄中。

使用ffmpeg編譯錯誤解決辦法

一、FFmpeg原始碼下載與編譯 # wget http://www.ffmpeg.org/releases/ffmpeg-0.5.13.tar.bz2 # tar -jxvf ffmpeg-0.5.13.tar.bz2 # vim ffmpeg_configure.sh .

mac 上 android boost 編譯使用

mac 上 android boost 庫的編譯及使用 環境 系統:mac osx v10.13.4 (17E199) ndk:android-ndk-r16b boost版本:v1.66.0 一,編譯 使用編譯腳進行編譯,地址如下:https://github.co

Makefile 編譯動態檔案連結動態

原文轉自 :http://www.cnblogs.com/ljtknowns/p/5647793.html 檔案目錄結構如下 1 dynamiclibapp.c 2 Makefile 3 comm/inc/apue.h 4 comm/errorhandle.c 5

contos7編譯安裝git搭建git遠端版本鉤子自動更新

一  安裝最新版git1.檢視yum源倉庫git資訊: yum info git初始化的阿里雲contos7的yum是1.8.3.1版本的;和官網不匹配;2.依賴庫安裝yum install curl-devel expat-devel gettext-devel opens

C++ jsoncpp編譯連結的使用

1. Jsoncpp介紹   (1)JsonCpp主要包含三種類型的class:Value Reader Writer;     Json::Value 是jsoncpp 中最基本、最重要的類,用於表示各種型別的物件,jsoncpp 支援的物件型別可見 Json::Va

32位的fortran函式在64位Linux下編譯使用的方法

      最近一直在使用一個數值函式庫。為了嘗試64位的精度,花了整夜折騰出些東西。       函式庫在32位Fedora下使用時,文件提供的例程的呼叫的都是以靜態庫方式呼叫的,使用g95編譯後,用ar 工具整理到了一個.a檔案。在64位的Fedora 13中,使用64位

linux內核編譯系統裁減

smo boot efi val 編譯 .org 執行 sys some 核心:/boot/vmlinuz-version 內核模塊(ko):/lib/modules/version/ 內核設計: 單內核 模塊化設計 微內核 裝載模塊: insmod modpr

Django基礎篇之數據選擇相關操作

setting 必須 需要 mysql pyc -- creates 127.0.0.1 settings 在djanjo框架中我們最常用的框架分別就是mysql和sqlit了,下面我們將分別講述一下這倆種數據庫的基礎必備知識 mysql 一、利用命令創建(在終端上執行)

CxImage的編譯簡單使用舉例

end ron bin 源碼 clu cximage itl tools ostream 1、 從http://sourceforge.net/projects/cximage/下載最新的CxImage 702源碼; 2、 解壓縮後,以管理員身份打開CxImageFu

C++靜態編譯

opencv ng- res tracking mic gdi end jasper debug模式 MFC 選項選擇: 靜態庫編譯 增加頭文件:( opencv相關的) #pragma once #ifdef WIN32 #include <open

數據原理應用——關系數據

block 關系數據庫 ces and 卡爾 svg 數據庫原理 -m 元組 關系數據結構 實體,實體間的聯系都是關系表示,用戶角度的邏輯結構就是二維表 關系:笛卡爾積的子集 關系操作集合 傳統集合操作:並、交、差、笛卡爾積 專門的關系運算:

pgpool中定義的數據節點pgpool支持的復制模式

rim prim urn mas this 節點 conn def 定義 /* * The first DB node id appears in pgpool.conf or the first "live" DB * node otherwise. */#define

數據原理應用(SQL Server 2016數據處理)【上海精品視頻課程】

應用 原理 sql 信息無處不在,數據處理無處不用。物質、信息、能源已經成為人類生存和發展的重要保障。數據庫的應用廣度深度及建設規模已經成為衡量一個國家信息化程度的一項重要標誌。數據庫技術是計算機學科的一個重要分支,反映了數據管理的最新技術。數據庫技術與計算機網絡、人工智能一起被稱為計算機三大

高性能可擴展MySQL數據設計架構優化 電商項目_1

電商一 數據庫設計規範1 命名規範 所有數據庫對象名稱必須用小寫字母並下劃線分割對象名稱禁止使用MySQL保留關鍵字命名要做到見名識義,不超過32字節臨時表必須tmp前綴 日期後綴備份庫表bak前綴 日期後綴所有存儲相同數據的列名和類型必須一致2 數據庫基本設計規範所有表必須用innodb引擎數據庫和表字符集

SQLite3動態、靜態編譯

定義 tree 技術分享 使用 ati html ble down 選擇 資源準備 1、下載SQLite3源碼,下載地址為https://www.sqlite.org/download.html。下載sqlite-amalgamation-3200000.zip和sqli