Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3105767
  • 博文数量: 396
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 4209
  • 用 户 组: 普通用户
  • 注册时间: 2016-07-04 13:04
文章分类

全部博文(396)

文章存档

2022年(1)

2021年(2)

2020年(8)

2019年(24)

2018年(135)

2017年(158)

2016年(68)

我的朋友

分类: 嵌入式

2017-10-27 16:51:09

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

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

1、从下载zlib库

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

./configure

make

make install

2、从 下载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、从 下载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、从 下载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头文件:
  1. #ifndef QRWIDGET_H  
  2. #define QRWIDGET_H  
  3.   
  4. #include   
  5. #include "qrencode.h"  
  6.   
  7. class QRWidget : public QWidget  
  8. {  
  9.     Q_OBJECT  
  10. public:  
  11.     explicit QRWidget(QWidget *parent = 0);  
  12.     ~QRWidget();  
  13.     void setString(QString str);  
  14.     int getQRWidth() const;  
  15.     bool saveImage(QString name, int size);  
  16. private:  
  17.     void draw(QPainter &painter, int width, int height);  
  18.     QString string;  
  19.     QRcode *qr;  
  20. signals:  
  21.   
  22. protected:  
  23.     void paintEvent(QPaintEvent *);  
  24.     QSize sizeHint() const;  
  25.     QSize minimumSizeHint() const;  
  26. public slots:  
  27. };  
  28.   
  29. #endif // QRWIDGET_H
qrwidget.cpp


  1. #include "qrwidget.h"  
  2. #include   
  3. #include   
  4. QRWidget::QRWidget(QWidget *parent) : QWidget(parent)  
  5. {  
  6.     qr = NULL;  
  7.     setString("Hello QR Code");  
  8. }  
  9.   
  10. QRWidget::~QRWidget()  
  11. {  
  12.     if(qr != NULL)  
  13.     {  
  14.         QRcode_free(qr);  
  15.     }  
  16. }  
  17.   
  18. int QRWidget::getQRWidth() const  
  19. {  
  20.     if(qr != NULL)  
  21.     {  
  22.         return qr->width;  
  23.     }  
  24.     else  
  25.     {  
  26.         return 0;  
  27.     }  
  28. }  
  29.   
  30. void QRWidget::setString(QString str)  
  31. {  
  32.     string = str;  
  33.     if(qr != NULL)  
  34.     {  
  35.         QRcode_free(qr);  
  36.     }  
  37.     qr = QRcode_encodeString(string.toStdString().c_str(),  
  38.                              1,  
  39.                              QR_ECLEVEL_L,  
  40.                              QR_MODE_8,  
  41.                              1);  
  42.     update();  
  43. }  
  44. QSize QRWidget::sizeHint()  const  
  45. {  
  46.     QSize s;  
  47.     if(qr != NULL)  
  48.     {  
  49.         int qr_width = qr->width > 0 ? qr->width : 1;  
  50.         s = QSize(qr_width * 4, qr_width * 4);  
  51.     }  
  52.     else  
  53.     {  
  54.         s = QSize(50, 50);  
  55.     }  
  56.     return s;  
  57. }  
  58.   
  59. QSize QRWidget::minimumSizeHint()  const  
  60. {  
  61.     QSize s;  
  62.     if(qr != NULL)  
  63.     {  
  64.         int qr_width = qr->width > 0 ? qr->width : 1;  
  65.         s = QSize(qr_width, qr_width);  
  66.     }  
  67.     else  
  68.     {  
  69.         s = QSize(50, 50);  
  70.     }  
  71.     return s;  
  72. }  
  73. bool QRWidget::saveImage(QString fileName, int size)  
  74. {  
  75.     if(size != 0 && !fileName.isEmpty())  
  76.     {  
  77.         QImage image(size, size, QImage::Format_Mono);  
  78.         QPainter painter(&image);  
  79.         QColor background(Qt::white);  
  80.         painter.setBrush(background);  
  81.         painter.setPen(Qt::NoPen);  
  82.         painter.drawRect(0, 0, size, size);  
  83.         if(qr != NULL)  
  84.         {  
  85.             draw(painter, size, size);  
  86.         }  
  87.         return image.save(fileName);  
  88.     }  
  89.     else  
  90.     {  
  91.         return false;  
  92.     }  
  93. }  
  94.   
  95. void QRWidget::draw(QPainter &painter, int width, int height)  
  96. {  
  97.     QColor foreground(Qt::black);  
  98.     painter.setBrush(foreground);  
  99.     const int qr_width = qr->width > 0 ? qr->width : 1;  
  100.     double scale_x = width / qr_width;  
  101.     double scale_y = height / qr_width;  
  102.     forint y = 0; y < qr_width; y ++)  
  103.     {  
  104.         for(int x = 0; x < qr_width; x++)  
  105.         {  
  106.             unsigned char b = qr->data[y * qr_width + x];  
  107.             if(b & 0x01)  
  108.             {  
  109.                 QRectF r(x * scale_x, y * scale_y, scale_x, scale_y);  
  110.                 painter.drawRects(&r, 1);  
  111.             }  
  112.         }  
  113.     }  
  114. }  
  115.   
  116. void QRWidget::paintEvent(QPaintEvent *)  
  117. {  
  118.     QPainter painter(this);  
  119.     QColor background(Qt::white);  
  120.     painter.setBrush(background);  
  121.     painter.setPen(Qt::NoPen);  
  122.     painter.drawRect(0, 0, width(), height());  
  123.     if(qr != NULL)  
  124.     {  
  125.         draw(painter, width(), height());  
  126.     }  
  127. }
  128. 创建工程

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

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

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


阅读(2585) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~