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

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

qrencode编译需要libpng库,而libpng库依赖zlib库

1、从http://zlib.net/下载zlib库

tar xvzf zlib-1.2.8.tar.gz,进入zlib-1.2.8文件夹

./configure

make

make install

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

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、交叉编译zlib
编译平台:ubuntu14.04

交叉工具链:arm-none-linux-gnueabi-4.8.3

、简介

    zlib是提供数据压缩用的函式库,使用DEFLATE算法,最初是为libpng函式库所写的,后来普遍为许多软件所使用。此函式库为自由软件,使用zlib授权。
2、交叉编译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目录


3、交叉编译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目录。


4.交叉编译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

安装完毕

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

1、从http://fukuchi.org/works/qrencode/ 下载qrencode-3.4.4.tar.gz

tar xvzf qrencode-3.4.4.tar.gz
mkdir libqrencode

进入qrencode-3.4.4目录

./configure --prefix=/home/libqrencode --without-tools

make

make install

安装完毕
2。交叉编译qrencode-3.4.4.tar.gz

tar xvzf qrencode-3.4.4.tar.gz

mkdir libqrencode-arm
进入qrencode-3.4.4目录

./configure --prefix=/homel/libqrencode-arm --host=arm-none-linux-gnueabi --without-tools

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里面;

 

————————————————
版权声明:本文为CSDN博主「缘客_ql」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u014213012/article/details/51833299

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值