zoukankan      html  css  js  c++  java
  • ubuntu 交叉编译qt 5.7 程序到 arm 开发板

    ubuntu 交叉编译qt 5.7 程序到 arm 开发板
    平台
    1 ubuntu 12.04
    2 arm-linux-gcc 4.5.1
    3 QT 5.7
    4 开发板210 armcortex-A8 


    一 概述
    QT5的ARM移植及其中文显示


    二 准备工具
    1.交叉编译工具(arm-linux-gnueabi-4.5.1.tar.bz2)
    2.交叉编译好的Qt库(armqt5.5-gec.all.fonts.tar.bz2)
    3.要用到的库(Qt依赖的库)(armlib-all.tar.bz2,字体,触摸屏,总线)tslib库,(armqt5.5-gec下载到开发板(只下载里面的(lib, plugins))


    三 交叉编译环境搭建
    1 源码编译 (ARM版本 开发板运行环境搭建) 从 http://www.qt.io/download-open-source/下载 Qt 源代码进行交叉编译 


    2 把源代码到 qt-everywhere-opensource-src-5.5.0.tar.gz 下载到 linux 系统的某个目录下面解压, 进入 qt-everywhere-opensource-src-5.5.0 目录交叉编译 Qt 源代码得到 ARM 平台的 Qt


    3 准备:
    4 arm 的工具链--这里用的是 arm-linux-gcc(4.5.1)
    5 修改 qt-everywhere-opensource-src-5.5.0/qtbase/mkspeces/linux-arm-gnueabi-g++/qmake.conf
    在文件最前面添加一行 QT_QPA_DEFAULT_PLATFORM=linuxfb 并且把 arm-linux-gnueabi-
    改为自己系统中安装的 arm 工具链名称这里改为 arm-linux-
    6 配置


    ./configure -v --prefix=/opt/armqt5.5-gec/ -release -make libs -xplatform linux-arm-gnueabi-g++
    -optimized-qmake -pch -qt-sql-sqlite -qt-libjpeg -qt-libjpeg -qt-zlib -qt-freetype -no-sse2
    -no-opengl -no-openssl -no-nis -no-cups -no-glib -no-iconv -no-xcursor -no-xfixes -no-xrandr
    -no-xrender -no-separate-debug-info -nomake tools -nomake examples
    -I/home/tiydy/armlib/tslib/include -L/home/tiydy/armlib/tslib/lib


    为了是 Qt5 支持 tslib 添加下路径编译触摸插件
    -I/home/tiydy/armlib/tslib/include 为 tslib 的头文件路径
    -L/home/tiydy/armlib/tslib/lib 为 tslib 的库文件路径


    配置后运行 make -j 4 (可以 4 个目标一起构建提高编译速度)
    编译后运行 make install (就会把 Qt 安装在/opt/armqt5.5-gec/目录下了)


    把/opt/armqt5.5-gec/目录下的 lib 和 plugins 目录拷贝到开发板/opt/armqt5.5-gec 目录就可以并


    且在开发板/etc/profile 文件中添加下面配置
    export QTDIR=/opt/armqt5.5-gec
    export QT_QPA_PLATFORM_PLUGIN_PATH=$QTDIR/plugins
    export QT_QPA_PLATFORM=linuxfb
    export QT_QPA_FONTDIR=$QTDIR/lib/fonts
    export LD_PRELOAD=/tslib/lib/libts.so
    export QT_QPA_GENERIC_PLUGINS=tslib
    export LD_LIBRARY_PATH=/tslib/lib:$QTDIR/lib 


    四 PC交叉编译程序
    1 安装交叉编译工具(4.5.1)
    (安装交叉编译工具arm-linux-g++/gcc 把arm-linux-gnueabi-4.5.1.tar.bz2解压到/opt目录下)
    # ~/armQt$ cp arm-linux-gnueabi-4.5.1.tar.bz2 /opt/
    进入/opt目录
    # tar -jxf arm-linux-gnueabi-4.5.1.tar.bz2 
    # mv usr/local/arm/4.5.1/ ./

    2 安装交叉编译好的Qt库
    (安装编译好的Qt库,把armqt5.5-gec.all.fonts.tar.bz2 解压到/opt目录下)
    gec@ubuntu:~/armQt$  cp armqt5.5-gec.all.fonts.tar.bz2 /opt/
    进入/opt目录解压
    gec@ubuntu:/opt$ tar -jxf armqt5.5-gec.all.fonts.tar.bz2


    3 设置交叉编译工具环境变量 ,路径据ubuntu实际
    查看环境变量配置的路径 # echo $PATH
    3.1 方法1
    gec@ubuntu:/opt$  export PATH=/opt/4.5.1/bin/:$PATH (放入配置文件/etc/bash.bashrc)


    3.2 方法2 环境配置文件 编辑vi /etc/profile, 重启 source /etc/profile  (注意:用source重启只用本终端有效,编译的哪个终端也要重启,不然环境还没改过来,)
    export PATH=/opt/usr/local/arm/4.5.1/bin/:$PATH   //:$PATH (代表以前的)要写在后面, 设置的要放在以前的前面,优先使用以前的
    export PATH=/opt/armqt5.5-gec/bin/:$PATH

    3.3 方法3 
    编写环境配置文件env.sh
    export QTDIR=/opt/armqt5.5-gec
    export PATH=$QTDIR:/opt/usr/local/arm/4.5.1/bin:$PATH  (据实际目录设置)  //如QT安装在ubuntu,  opt/Qt5.5.0/5.5/gcc/bin/qmake ,生成makefile,g++编译在ubuntu运行的程序
    //export PATH=$QTDIR:/usr/local/arm/4.5.1/bin:$PATH
    把env.sh文件放入工程目录下
    source env.sh ----


    4 交叉编译程序


    4.1 创建一个qmake别名
    alias armqmake='/opt/armqt5.5-gec/bin/qmake'
    进入qt项目目录下
    MyRun        MyRun.pro       mythread.cpp
    Makefile       myrun.cpp    MyRun.pro.user  mythread.h
    moc_myrun.cpp  myrun.h      myrun.ui        mythread.o
    gec@ubuntu:/mnt/hgfs/C++-QT/Qt/004/code/MyRun$


    4.2 使用Qt的qmake工具生成交叉编译的makefile文件--make编译/opt/armqt5.5-gec/bin/qmake
    4.2.1 用指定的qmake生成Makefile文件
    生成arm版本的Makefile ----》qmake
    gec@ubuntu:/mnt/hgfs/C++-QT/Qt/004/code/MyRun$  armqmake  //别名alias armqmake='/opt/armqt5.5-gec/bin/qmake'


    4.2.2 生成arm版本的程序----》make
    gec@ubuntu:/mnt/hgfs/C++-QT/Qt/004/code/MyRun$  make


    4.2.3 把生成的可执行文件下载到开发板(根目录)运行


    5 开发板Qt运行环境搭建
    把交叉编译好的qt库下载到开发板


    5.1 制作开发板文件系统, 
    5.1.1 常用目录
    bin   //命令 ,把 armlib.tar.bz2下面的/dbus/bin 目录下的文件拷贝进来
    opt   //放qt库存 ,从第二步的裁剪好的库放进去,可按需要后续添加, 在QT软件 帮助--索引可查询函数所依赖的库
    ioT //驱动
    tslib //触屏
    usr
    /usr/share/fonts/ //字库目录,可从ubuntu拷贝过来
    /usr/share/fonts/truetype  //把字体放到这个目录
    etc //配置文件
    /etc/profile
    lib //库 ,把 armlib.tar.bz2下面的/dbus/lib 目录下的文件拷贝进来(拷贝时加选项把链接文件也一起拷贝 -radf )


    5.1.2 打包目录成img文件, 把所有文件目录放到总目录 rootfs 下
    # ./mkyaffs2image   rootfs  rootfs-v1.img
    mkyaffs2image.rar

    5.2 QT主要的库, (放在开发板/opt下) armqt5.5-gec.all.fonts.tar.bz2,准备交叉编译好的Qt库(把交叉编译好的Qt库下载到开发板/opt/下)
    5.2.1 qt库存在开发板目录 /opt/armqt5.5-gec/lib
    //配置文件: /etc/profile 
    //# cp unyaffs /bin/
    //# unyaffs  rootfs.img


    5.2.2 裁剪qt库, 把armqt5.5-gec.all.fonts.tar.bz2 , 解压得目录 armqt5.5-gec


    5.2.2.1 armqt5.5-gec 里可以删去的目录 rm bin/ doc/ include/  -r   //
    5.2.2.2 armqt5.5-gec/lib 里必要的三个文件, 例: cp  libQt5Core.*  ./  -radf   //-radf和链接文件一起拷贝
    libQt5Core.   //核心
    libQt5Gui. //按钮,图形
    libQt5Widgets. //图形,界面


    5.2.2.3 armqt5.5-gec/lib 里的其它文件
    libQt5Network //网络
    libQt5Sql. //数据库
    libQt5DBus. //总线
    libQt5PrintSuppon //打印机


    5.2.2.4 把裁剪好的armqt5.5-gec拷贝开发板/opt下


    5.3 QT依赖的库,(armlib-all.tar.bz2,字体,触摸屏(tslib库),总线), 解压得目录armlib 
    5.3.1拷贝armlib-all.tar.bz2到开发板/home/tiydy目录下(如果没有创建一个)
    解压 tar -jxf armlib-all.tar.bz2  //解压得目录armlib


    5.3.2字库拷贝到开发板
    在开发板创建一个存入字库的目录mkdir /usr/share/fonts/truetype
    在把字库droid拷贝到这个目录下


    5.3.3 机器码machine-id
    把/dbus/lib中的库拷贝到开发板/lib下(-radf包含链接文件)
    # cp ./* /lib -radf
    把/dbus/bin下的文件拷贝到开发板bin目录  ,(或在环境变量 /etc/profile设置路径)
    # cp ./* /bin
    在开发板运行(因dbus-uuidgen已拷贝到/bin , 所以在哪个目录下运行都可以)
    # dbus-uuidgen > /etc/machine-id   (重定向创建文件)


    5.4设置开发板配置文件/etc/profile
    方法1
    把profile配置文件拷贝到开发板/etc/ 
    把带QPE的删除或注释


    方法2 
    #fonts   //字库 , 开发板上,QT显示汉字
    export FONTDIR =/home/tiydy/armlib
    export LD_LIBRARY_PATH =$LD_LIBRARY_PATH:$FONTDIR/fontconfig/lib:$FONTDIR/freetype/lib


    #QT5 config  //QT5配置
    export QTDIR =/opt/armqt5.5-gec  //QT路径
    export QT_QPA_PLATFORM_PLUGIN_PATH =$QTDIR/plugins//QT插件路径
    export QT_QPA_PLATFORM =linuxfb //QT显示的一种方式
    export QT_QPA_FONTDIR =$QTDIR/lib/fonts //QT字库路径
    export LD_PRELOAD =/tslib/lib/libts.so:$QTDIR/plugins/platforms/libqlinuxfb.so//导入触摸屏库存,插件平台库存(linuxfb对应的插件)
    export QT_QPA_GENERIC_PLUGINS =tslib  //指定用tslib来实现
    export LD_LIBRARY_PATH =/tslib/lib:$QTDIR/lib:$LD_LIBRARY_PATH//指定用tslib的库  


    五 Qt程序移植到开发板
    1 在运行qt程序
    # ./文件名


    六 异常及解决
    1 [root@GEC210 /]# ./a1025 
    1.1 错误提示
    ./a1025: error while loading shared libraries: libfontconfig.so.1: cannot open shared object file: No such file or directory  //找不到libfontconfig.so.1


    1.2查找有没有这个文件, 如果没有这安装相关库存,或从其它拷贝
    [root@GEC210 /]# find / -name "libfontconfig*"
    /opt/armlib/fontconfig/lib/libfontconfig.so.1.4.1
    /opt/armlib/fontconfig/lib/libfontconfig.so
    /opt/armlib/fontconfig/lib/libfontconfig.so.1
    /opt/armlib/fontconfig/lib/libfontconfig.a
    /opt/armlib/fontconfig/lib/libfontconfig.la
    /opt/armlib/fontconfigs/lib/libfontconfig.so
    /opt/armlib/fontconfigs/lib/libfontconfig.so.1


    1.3把文件的路径添加到 /etc/profile
    如, a) 另定义一个目录路径(FONTDIR_OPT)
    export FONTDIR_OPT=/opt/armlib/fontconfigs   
    b) 添加到路径集里 (:$FONTDIR_OPT)
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$FONTDIR/fontconfig/lib:$FONTDIR/freetype/lib:$FONTDIR_OPT/lib  


    2 [root@GEC210 /]# ./a1025 
    ./a1025: error while loading shared libraries: libQt5DBus.so.5: cannot open shared object file: No such file or directory   //没找到文件
    查找只有这个,原文件,可软链接成多个版本, 如 *.so  ,  *.so.5  ,  *.so.5.5
    libQt5Gui.so.5.5.0
    软链接 : ln 原文件  生成的链接文件  -s
    ln libQt5DBus.so.5.5.0 libQt5DBus.so.5 -s


    3 在开发板运行程序出现下面错误  (没找机器码machine-id)
    3.1 错误提示
    from:tiydy-2015-10-16
    process 146: D-Bus library appears to be incorrectly set up;
    failed to read machine uuid: Failed to open "/etc/machine-id": No such file or directory
    See the manual page for dbus-uuidgen to correct this issue.
    D-Bus not built with -rdynamic so unable to print a backtrace
    Aborted


    3.2 解决
    3.2.1 添加dbus库, (库在armlib.tar.bz2下面的/dbus/lib里面)


    3.2.2 解压后,把/dbus/lib中的库拷贝到开发板/lib下(-radf包含链接文件)
    # cp ./* /lib -radf


    3.2.3把/dbus/bin下的文件拷贝到开发板bin目录  ,(或在环境变量 /etc/profile设置路径)
    # cp ./* /bin


    3.2.4在开发板运行(因dbus-uuidgen已拷贝到/bin , 所以在哪个目录下运行都可以)
    # dbus-uuidgen > /etc/machine-id   (重定向创建文件)
    ---------------------
    作者:catemo
    来源:CSDN
    原文:https://blog.csdn.net/catemo/article/details/53131571
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    复杂声明的正确解读(*、()、[])
    (多张图片打包为Zip返回前端下载) 记NetCore HttpClient.GetStreamAsync()返回只读流,Stream的Length属性不可用,报错的问题。
    ### Vue开发环境搭建
    计算机网络原理----CRC编码相关问题及解题思路
    CentOS7安装MongoDB4.4.4
    树莓派4B安装.NET Core 3.1 SDK
    基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(TableGo v7.0.0版)
    解决Unity启动报错 Assertion failed on expression: 'SUCCEEDED(hr)'
    @RabbitListener注解导致spring bean注入属性为空 解决方案
    一文彻底讲透@Async注解的原理和使用方法
  • 原文地址:https://www.cnblogs.com/findumars/p/9525430.html
Copyright © 2011-2022 走看看