使用适用于Linux的DBR 5.2构建Swift条形码阅读器
几周前,苹果发布了Swift 4.0 ,可用于macOS和Ubuntu 14/16。 在本文中,我将分享如何使用Dynamsoft Barcode Reader SDK for Linux实现一个简单的Swift条码读取器(命令行工具)。
- Windows 10。
- VMware 11.1.2。
- Ubuntu 14.04。
- 斯威夫特4.0。
- 适用于Linux的Dynamsoft条码阅读器5.2。
使用虚拟机时,如果要使用Windows工具为Linux编写代码,则可以使用共享文件夹。
通过虚拟机设置添加共享文件夹很容易:
但是,来宾操作系统中的/ mnt /下可能没有列出共享文件夹,例如Ubuntu 14.04。 运行以下命令以检查Ubuntu版本:
lsb_release -a
要解决此问题,请下载并安装补丁程序:
git clone https://github.com/rasa/vmware-tools-patches.git
cd
vmware-tools-patches
sudo
./patched-open-vm-tools.sh
sudo
vmware-config-tools.pl
sudo
reboot
现在您可以看到共享文件夹和文件。 这种方式适用于运行如下所示的快速代码:
迅捷xxx.swift
但是,如果使用swiftc编译代码,则会导致错误:
swiftc test.swift
/usr/bin/ld.gold: fatal error: test: Input/output
error
clang: error: linker command
failed with exit
code 1 (use -v
to see invocation)
:0: error: link command
failed with exit
code 1 (use -v
to see invocation)
要使用Swift,您必须预先安装以下依赖项:
须藤apt-get install clang libicu-dev
如果您无法运行swiftc,请参考Vincent Saluzzo的解决方案:
sudo
apt-get install
-y libicu-dev
sudo
apt-get install
-y clang-3.6
sudo
update-alternatives --install
/usr/bin/clang
clang /usr/bin/clang-3.6 100
sudo
update-alternatives --install
/usr/bin/clang++ clang++ /usr/bin/clang++-3.6 100
受StackOverflow问题的启发-在Linux下编译C代码并将其公开给Swift,我已经通过链接libDynamsoftBarcodeReader.so成功创建了命令行条形码阅读器。
使用一些公开的方法创建dbr.h :
#include "DynamsoftBarcodeReader.h"
int
initLicense( const
char * pszLicense);
char * decodeFile( const
char * pFileName, int
iFormat);
char * pFileName, int
iFormat);
int
createDBR();
void
destroyDBR();
创建dbr.c来调用Dynamsoft Barcode Reader SDK:
#include
#include "dbr.h"
#define DBR_NO_MEMORY 0
#define DBR_SUCCESS 1
// Barcode reader handler
void * hBarcode = NULL;
/**
* Create DBR instance
*/
int
createDBR()
{
if
(!hBarcode) {
hBarcode = DBR_CreateInstance();
if
(!hBarcode)
{
printf ("Cannot allocate memory!\n");
return
DBR_NO_MEMORY;
return
DBR_SUCCESS;
}
/**
* Destroy DBR instance
*/
void
destroyDBR()
{
if
(hBarcode) {
DBR_DestroyInstance(hBarcode);
}
}
/**
* Set Dynamsoft Barcode Reader license.
* To get valid license, please contact support@dynamsoft.com
* Invalid license is acceptable. With an invalid license, SDK will return an imcomplete result.
* Invalid license is acceptable. With an invalid license, SDK will return an imcomplete result.
*/
int
initLicense( const
char * pszLicense)
{
if
(!createDBR())
{
return
-1;
}
return
DBR_InitLicenseEx(hBarcode, pszLicense);
}
char * createPyResults(SBarcodeResultArray *pResults)
{
// Get barcode results
int
count = pResults->iBarcodeCount;
SBarcodeResult** ppBarcodes = pResults->ppBarcodes;
SBarcodeResult* tmp = NULL;
int
i = 0;
for
(; i < count; i++)
{
tmp = ppBarcodes[i];
printf ("Result: %s, Format: %s\n", tmp->pBarcodeData, tmp->pBarcodeFormatString);
}
// Release memory
DBR_FreeBarcodeResults(&pResults);
return
NULL;
}
/**
* Decode barcode from a file
*/
char * decodeFile( const
char * pFileName, int
iFormat)
char * pFileName, int
iFormat)
{
if
(!createDBR())
{
return
NULL;
}
// Initialize Dynamsoft Barcode Reader
int
iMaxCount = 0x7FFFFFFF;
SBarcodeResultArray *pResults = NULL;
DBR_SetBarcodeFormats(hBarcode, iFormat);
DBR_SetMaxBarcodesNumPerPage(hBarcode, iMaxCount);
// Barcode detection
int
ret = DBR_DecodeFileEx(hBarcode, pFileName, &pResults);
// Wrap results
return
createPyResults(pResults);
}
创建条形码.swift以调用C API:
let count = CommandLine.arguments.count
if
count < 2 {
print("Please add a file name. Eg ./barcode test.tif")
}
else
{
let fileName = CommandLine.arguments[1]
createDBR()
let ret = initLicense("t0068MgAAAGvV3VqfqOzkuVGi7x/PFfZUQoUyJOakuduaSEoI2Pc8+kMwjrojxQgE5aJphmhagRmq/S9lppTkM4w3qCQezxk=")
if
ret == 0 {
// Read barcode
let barcodeTypes : Int32 = 0x3FF
0x2000000
0x80000000x4000000; // 1D, QRCODE, PDF417, DataMatrix
0x4000000; // 1D, QRCODE, PDF417, DataMatrix
decodeFile(fileName, barcodeTypes);
}
destroyDBR()
}
用gcc编译dbr.c:
gcc -c dbr.c
用swiftc编译Barcode.swift :
swiftc -import-objc-header dbr.h条码.swift dbr.o -o条码-lDynamsoftBarcodeReader
运行快速条形码阅读器:
./条形码test.tif
https://github.com/dynamsoft-dbr/linux-swift-4.0-barcode-reader
最初于 2017年10月16日 发布在 www.codepool.biz 。