qrencode-libqrecode的安装移植和应用-qrencode的交叉编译

目录

一:依赖第三方库的编译方法

1.1 编译PC-x86版本

1.1.1从http://zlib.net/下载zlib库

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 编译ARM版本

1.2.1.交叉编译zlib步骤

1.2.2.交叉编译libpng步骤

1.2.3.交叉编译qrencode-3.4.4.tar.gz

二:不依赖第三方库的编译方法

1.编译PC-X86版本

2.交叉编译ARM动态库版本

3.交叉编译ARM静态库版本(接上一步直接./configure,请先 make clean)

三:应用qrencode在qt上

1.创建工程

2.拷贝刚才编译的qrencode.h 到当前目录

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 到当前目录

 

3.添加qrencode和libqrencode.so*的路径到工程中

4.复制上面的贴的代码即可编译,然后把libqrencode.so*的文件全部复制到运行的debug或release里面;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值