目录
1.1.2.从http://sourceforge.net/projects/libpng/files/ 下载libpng-1.6.17.tar.xz
1.1.3.从http://fukuchi.org/works/qrencode/ 下载qrencode-3.4.4.tar.gz
1.2.3.交叉编译qrencode-3.4.4.tar.gz
3.交叉编译ARM静态库版本(接上一步直接./configure,请先 make clean)
3.添加qrencode和libqrencode.so*的路径到工程中
4.复制上面的贴的代码即可编译,然后把libqrencode.so*的文件全部复制到运行的debug或release里面;
一:依赖第三方库的编译方法
qrencode编译需要libpng库,而libpng库依赖zlib库
1.1 编译PC-x86版本
1.1.1从http://zlib.net/下载zlib库
tar xvzf zlib-1.2.8.tar.gz,进入zlib-1.2.8文件夹
./configure
make
make install
1.1.2.从http://sourceforge.net/projects/libpng/files/ 下载libpng-1.6.17.tar.xz
tar xvf libpng-1.6.17.tar.xz得到libpng-1.6.17文件夹
在/home目录下创建libpng
进入libpng-1.6.17文件夹
./configure --prefix=/home/libpng
make
make install
1.1.3.从http://fukuchi.org/works/qrencode/ 下载qrencode-3.4.4.tar.gz
tar xvzf qrencode-3.4.4.tar.gz
设置png_CFLAGS和png_LIBS环境变量
在.bashrc文件中添加
export png_CFLAGS="-I/home/libpng/include"
export png_LIBS="-L/home/libpng/lib -lpng"
mkdir libqrencode
进入qrencode-3.4.4目录
./configure --prefix=/home/libqrencode
make
make install
安装完毕
1.2 编译ARM版本
编译平台:ubuntu14.04交叉工具链:arm-none-linux-gnueabi-4.8.3
zlib是提供数据压缩用的函式库,使用DEFLATE算法,最初是为libpng函式库所写的,后来普遍为许多软件所使用。此函式库为自由软件,使用zlib授权。
1.2.1.交叉编译zlib步骤
tar xvzf zlib-1.2.8.tar.gz,进入zlib-1.2.8文件夹
mkdir /home/zlib-1.2.8-arm
cd zlib-1.2.8
./configure --prefix=/home/zlib-1.2.8-arm
Zlib配置是不支持--host项,交叉编译时需要手动更改Makefile,将Makfile里的gcc、ar、ranlib均加上前缀arm-none-linux-gnueabi-(可以看交叉编译工具链的安装目录下的前缀),再执行make && make install,编译安装成功后在--prefix指定的目录下生成include、shared和lib目录
1.2.2.交叉编译libpng步骤
tar xvf libpng-1.6.17.tar.xz
mkdir /home/libpng-arm
cd libpng-1.6.17
./configure --prefix=/home/libpng-arm --host=arm-none-linux-gnueabi
出现错误:
Checking for zlibVersion in -lz ... No
问题分析:
Libpng配置是会去检测zlib库,configure时加上zlib库的路径信息即可。
./configure --prefix=/home/libpng-arm --host=arm-none-linux-gnueabi LIBS=-L/home/zlib-1.2.8-arm/lib CPPFLAGS=-I/home/zlib-1.2.8-arm/include
配置完成后,执行make && make install,编译安装成功后在--prefix指定的目录下生成bin、include、shared和lib目录。
1.2.3.交叉编译qrencode-3.4.4.tar.gz
tar xvzf qrencode-3.4.4.tar.gz
设置png_CFLAGS和png_LIBS环境变量
在.bashrc文件中添加
export png_CFLAGS="-I/home/libpng-arm/include"
export png_LIBS="-L/home/libpng-arm/lib -lpng"
mkdir libqrencode
进入qrencode-3.4.4目录
./configure --prefix=/homel/libqrencode-arm --host=arm-none-linux-gnueabi
make
报错说libpng16not found 中的函数不行。后面看了其他的说法,qrencode不需要依赖第三方库,可以加选项 --without-tools,这个未解决。
make install
安装完毕
二:不依赖第三方库的编译方法
从http://fukuchi.org/works/qrencode/ 下载qrencode-3.4.4.tar.gz
1.编译PC-X86版本
tar xvzf qrencode-3.4.4.tar.gz
mkdir libqrencode-pc
进入qrencode-3.4.4目录
./configure --prefix=/home/libqrencode-pc --without-tools
make
make install
安装完毕
2.交叉编译ARM动态库版本
tar xvzf qrencode-3.4.4.tar.gz
mkdir libqrencode-arm-so
进入qrencode-3.4.4目录
./configure --prefix=/home/libqrencode-arm-so --host=arm-none-linux-gnueabi --without-tools
make
make install
安装完毕
3.交叉编译ARM静态库版本(接上一步直接./configure,请先 make clean)
tar xvzf qrencode-3.4.4.tar.gz
mkdir libqrencode-arm-static
进入qrencode-3.4.4目录
./configure --prefix=/home/libqrencode-arm-static --host=arm-none-linux-gnueabi --without-tools --enable-static --disable-shared
make
make install
安装完毕
三:应用qrencode在qt上
参考:http://blog.csdn.net/liyuanbhu/article/details/44599031 创建一个在qtcretor的gui应用,不含.ui界面文件
qrwidget.h头文件:
#ifndef QRWIDGET_H
#define QRWIDGET_H
#include <QWidget>
#include "qrencode.h"
class QRWidget : public QWidget
{
Q_OBJECT
public:
explicit QRWidget(QWidget *parent = 0);
~QRWidget();
void setString(QString str);
int getQRWidth() const;
bool saveImage(QString name, int size);
private:
void draw(QPainter &painter, int width, int height);
QString string;
QRcode *qr;
signals:
protected:
void paintEvent(QPaintEvent *);
QSize sizeHint() const;
QSize minimumSizeHint() const;
public slots:
};
#endif // QRWIDGET_H
qrwidget.cpp
#include "qrwidget.h"
#include <QPainter>
#include <QImage>
QRWidget::QRWidget(QWidget *parent) : QWidget(parent)
{
qr = NULL;
setString("Hello QR Code");
}
QRWidget::~QRWidget()
{
if(qr != NULL)
{
QRcode_free(qr);
}
}
int QRWidget::getQRWidth() const
{
if(qr != NULL)
{
return qr->width;
}
else
{
return 0;
}
}
void QRWidget::setString(QString str)
{
string = str;
if(qr != NULL)
{
QRcode_free(qr);
}
qr = QRcode_encodeString(string.toStdString().c_str(),
1,
QR_ECLEVEL_L,
QR_MODE_8,
1);
update();
}
QSize QRWidget::sizeHint() const
{
QSize s;
if(qr != NULL)
{
int qr_width = qr->width > 0 ? qr->width : 1;
s = QSize(qr_width * 4, qr_width * 4);
}
else
{
s = QSize(50, 50);
}
return s;
}
QSize QRWidget::minimumSizeHint() const
{
QSize s;
if(qr != NULL)
{
int qr_width = qr->width > 0 ? qr->width : 1;
s = QSize(qr_width, qr_width);
}
else
{
s = QSize(50, 50);
}
return s;
}
bool QRWidget::saveImage(QString fileName, int size)
{
if(size != 0 && !fileName.isEmpty())
{
QImage image(size, size, QImage::Format_Mono);
QPainter painter(&image);
QColor background(Qt::white);
painter.setBrush(background);
painter.setPen(Qt::NoPen);
painter.drawRect(0, 0, size, size);
if(qr != NULL)
{
draw(painter, size, size);
}
return image.save(fileName);
}
else
{
return false;
}
}
void QRWidget::draw(QPainter &painter, int width, int height)
{
QColor foreground(Qt::black);
painter.setBrush(foreground);
const int qr_width = qr->width > 0 ? qr->width : 1;
double scale_x = width / qr_width;
double scale_y = height / qr_width;
for( int y = 0; y < qr_width; y ++)
{
for(int x = 0; x < qr_width; x++)
{
unsigned char b = qr->data[y * qr_width + x];
if(b & 0x01)
{
QRectF r(x * scale_x, y * scale_y, scale_x, scale_y);
painter.drawRects(&r, 1);
}
}
}
}
void QRWidget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
QColor background(Qt::white);
painter.setBrush(background);
painter.setPen(Qt::NoPen);
painter.drawRect(0, 0, width(), height());
if(qr != NULL)
{
draw(painter, width(), height());
}
}
1.创建工程
2.拷贝刚才编译的qrencode.h 到当前目录