zoukankan      html  css  js  c++  java
  • Linux编译移植Qt4的环境_在OMAPL138平台

    Linux编译Qt4的环境_OMAPL138

    手里有一块创龙OMAPL138的板子,我要在上面成功移植Qt环境和触摸屏幕,这是我第二次进行Linux的Qt环境移植,发现了很多问题,需要重新整理。 我编译了,Qt5版本以上的,结果就是不成功,总是死在PDA问题上,在 configure文件上加入-xcb的选项,就算我安装了xcb所有的库文件,最后还是出问题,我还在研究之中,等着编译Qt5通过之后,我会重新写一个Linux编译Qt5的环境。

    本文不适合配置Qt5的环境,不要用在Qt5上

    准备

    • 交叉编译环境(一定要找到适合你板子的交叉编译环境)

    • Qte嵌入式源代码,文件的名字如同:qt-everywhere-opensource-src-4.8.6.tar.xz


    我的环境

    • PC 机: Ubuntu16.04 (64bit)

    • OMAPL138提供的交叉编译工具链:arm-arago-linux-gnueabi http://www.veryarm.com/arm-none-linux-gnueabi-gcc

      • PS:不同平台的交叉编译工具链不同,基本上芯片厂商出一个ARM芯片,就配套一个交叉编译工具链。
      • PS:最好检测板子是否支持整个工具链的方式就是编写一个最简单的hello word程序,然后到目标板子上运行,能够运行出来就说明这个交叉编译环境对劲儿。
    • Qt源码: qt-everywhere-opensource-src-4.8.6.tar.gz

      *下载地址:https://mirrors.tuna.tsinghua.edu.cn/qt/official_releases/qt/ 进入目录./4.8/4.8.6/single 找到这个文件。

    • tslib 1.4 触摸屏幕支持库:tslib1.4

    交叉编译环境配置

    其实也可以不进行配置,反正后面我们在编译器名称的时候都用绝对路径

    在本文中我就直接写交叉编译环境的路径按照我电脑上的配置了,如果配置你的话注意灵活修改路径:

    我的放在了:/home/delvis/opt/toolschain/omapl138 文件夹中

    编译tslib1.4

    对触摸屏信号的获取、校正、滤波处理,均采用开源的tslib,本文采用的tslib版本为最新的tslib1.4(可以从本文提供的链接中下载tslib1.4)。
    1.将下载好的tslib1.4拷贝到/home/lz/transplant目录下(可以根据自己的系统选择某一目录),然后执行解压缩命令

    tar -vxf tslib-1.4.tar.gz
    

    切换到tslib目录:

    cd tslib
    

    安装交叉编译tslib必须的一些工具(可以先查看是否已安装,ubuntu16.04自带这些工具,可跳过)

    sudo apt-get install autoconf
    sudo apt-get install automake
    sudo apt-get install libtool
    

    2.利用脚本写编译过程
    在tslib文件夹下新建文件configTslib14.sh

    touch autoconfig.sh
    vim autoconfig.sh
    chmod 777 autoconfig.sh
    

    内容如下:

    #!/bin/sh
    make clean && make distclean
    
    echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache
    
    CC=/home/delvis/opt/toolschain/omapl138/arm-none-linux-gnueabi
    
    ./configure --host=arm-linux --prefix=/home/delvis/opt/tslib1.4 --cache-file=arm-linux.cache
    
    make && make install
    

    这里面需要注意的地方就是:

    • CC=/home/delvis/opt/toolschain/omapl138/arm-none-linux-gnueabi 这个位置一定要修改成你的交叉编译环境的路径。
    • --prefix=/home/delvis/opt/tslib1.4 这个是编译好输出的路径,这个位置要注意了,很多网上的教程输出到的/opt/tslib1.4 这个路径,但是这个/opt的文件路径需要的权限是root,而我们编译运行的时候的路径没有使用root用户或者没有加sudo,所以这里推荐不要直接输出到/opt文件夹,而是自己的用户文件夹。

    然后运行

    ./autoconfig.sh
    

    执行结束后,我们查看一下是否安装成功,执行命令:

    ls /home/delvis/opt/tslib1.4
    

    如果出现bin,etc,include,lib这4个目录,如下图所示,说明交叉编译并安装tslib成功。 这个先放在这里了。这里写图片描述

    然后开始我们的重头戏,交叉编译Qt

    交叉编译QT4.8.6

    交叉编译Qt成功之后,编译后的文件需要应用两个位置,一个部分需要移植到我们的开发板上,另一个部分需要把编译成功的库配置到我们运行QtCreator的PC机上,两个部分只有统一了才不会出问题。

    1)准备好Qt的源码文件

    将下载的qt-everywhere-opensource-src-4.8.6.tar.gz执行如下命令解压:

    tar -vxf qt-everywhere-opensource-src-4.8.6.tar.gz
    
    cd qt-everywhere-opensource-src-4.8.6
    

    2)配置源码文件

    创建架构信息:

    • 进入架构信息路径 (qt4的源码路径一般是)

    cd ./qtbase/mkspecs/qws

    • 创建一个文件夹(ps: 预告以下这个文件名会影响到后面的配置,这个东西我搞了很久

    mkdir omapl-g++

    • 进入这个文件夹并创建两个文件

    cd omapl-g++; touch qmake.config qplatformdefs.h

    • 修改qplatformdefs.h ,直接把下面这个粘贴上去,只有这一句。
    #include "../../linux-g++/qplatformdefs.h"
    

    如果发现在编译过程中提示找不到qplatformdefs.h整个文件,就在mkspec/qws文件夹的其他架构信息的文件夹,看看人家的怎么写的是什么路径,基本上就是你的路径。

    • 修改交叉编译架构用到的信息:
    gedit qmake.conf
    

    在qmake.conf文件中需要注意以下信息:

    • QMAKE_CFLAGS_RELEASE += O2 -march=xxxxx,就是整个march要注意自己的平台是什么架构的,比如说arm9基本上就是arm5te,cortexA8都有不一样的架构,整个地方必须写正确,否则当我们搭建好交叉编译环境编译Qt工程然后运行的时候,就会出现illeagle instruction. 的错误提示。也有些配置文件没有指定这个信息,最好也写上。

    • 我在这里的时候,即便是配置了交叉编译环境,还是提示arm-linux-gnueabi-gcc找不到,而我单拿出来在命令行上面 arm-linux-gnueabi-gcc -v 的时候还能显示出来,我换了四种方法配置交叉编译环境,重启N次还是不见效,所以我在qmake.config文件上做了手脚,使用绝对路径进行配置,没想到编译通过了,所以我建议在qmake.config文件上使用绝对路径。

    • 后面的include也是,看看mkspec/qws/中的寻文件的路径是什么,可能是前一层的目录,也可能是前两层的目录。

    #
    # qmake configuration for building with arm-linux-gnueabi-g++
    #
    
    
    MAKEFILE_GENERATOR      = UNIX
    CONFIG                 += incremental
    QMAKE_INCREMENTAL_STYLE = sublib
    
    QT_QPA_DEFAULT_PLATFORM = linuxfb #eglfs
    
    #Compiler Flags to take advantage of the ARM architecture
    #Run the linux terminal command "arch" to see the detail your target cpu arch information.
    QMAKE_CFLAGS_RELEASE += -O3 -march=armv5te
    QMAKE_CXXFLAGS_RELEASE += -O3 -march=armv5te
    
    include(../../common/g++.conf)
    include(../../common/linux.conf)
    include(../../common/qws.conf)
    
    # modifications to g++.conf
    QMAKE_CC                = /home/delvis/opt/toolschain/omapl/arm-arago-linux-gnueabi/bin/arm-arago-linux-gnueabi-gcc
    QMAKE_CXX               = /home/delvis/opt/toolschain/omapl/arm-arago-linux-gnueabi/bin/arm-arago-linux-gnueabi-g++
    QMAKE_LINK              = /home/delvis/opt/toolschain/omapl/arm-arago-linux-gnueabi/bin/arm-arago-linux-gnueabi-g++
    QMAKE_LINK_SHLIB        = /home/delvis/opt/toolschain/omapl/arm-arago-linux-gnueabi/bin/arm-arago-linux-gnueabi-g++
    
    # modifications to linux.conf
    QMAKE_AR                = /home/delvis/opt/toolschain/omapl/arm-arago-linux-gnueabi/bin/arm-arago-linux-gnueabi-ar cqs
    QMAKE_OBJCOPY           = /home/delvis/opt/toolschain/omapl/arm-arago-linux-gnueabi/bin/arm-arago-linux-gnueabi-objcopy
    QMAKE_NM                = /home/delvis/opt/toolschain/omapl/arm-arago-linux-gnueabi/bin/arm-arago-linux-gnueabi-nm -P
    QMAKE_STRIP             = /home/delvis/opt/toolschain/omapl/arm-arago-linux-gnueabi/bin/arm-arago-linux-gnueabi-strip
    load(qt_config)
    

    3)创建configrue的执行文件

    回到qt的顶层目录,创建一个脚本文件,用于生成Makefile,执行命令

    gedit run.sh
    chmod 777 run.sh
    

    输入下面内容并保存:

    ./configure -prefix /home/delvis/work/qt-arm-4.8.6 -embedded arm -xplatform qws/omapl138-g++ -no-webkit -qt-libtiff -qt-libmng -no-neon -qtlibinfix E -nomake examples -lrt
    

    其中

    -prefix /home/delvis/work/qt-arm-4.8.6代表我们编译完QT后要安装地址(这个文件需要用到两个地方);你可以根据自己需求进行配置编译,去掉不需要的部分,留下需要的部分,比如:增加-tslib代表QT对触摸板的支持,-I 和 -L后面分别为为第一步编译tslib的include和lib的安装目录。 (这里暂时不给这些)

    执行命令:(这里推荐用sudo,管理员权限进行配置和编译,很多小伙伴遇到工具链中有一个东西没有调用的权限,结果搞了好久才搞明白,所以这里为了防止发生这样的问题,我们直接使用sudo

    sudo ./run.sh
    

    上述命令自动生成Makefile文件。

    *)说几个坑

    • 在编译之前需要检查一下Qt的编译环境有没有配置好,主要还是一下几个方面:
    1. 在命令行输入: export
    2. 然后输出几个找到QMAKESPEC这个,如果有这个,我们就要把它删除掉,否则就会很蛋疼。我们使用unset QMAKESPEC 这个命令,把这个环境变量在当前的命令窗口下删除,这样就不影响我们编译了。
    • 还有一个比较重点的坑,就是我们上面提到的mkdir omapl-g++,如果我们对Qt源文件下的配置文件不加修改,那么就会报错:undefined reference to `QInotifyFileSystemWatcherEngine::create()

      查找相关资料,查到这个解决方法,看画红圈的位置,还有其他网站提供的解决方案,加入arm-linux字符,但是在我这里依然不好使。后来我想明白了,经过实验也是正确的,这些解决方法没有给定原理在哪里。如图:

      我们在mkspec/qws中创建了文件夹(架构信息)的名字叫做omapl-g++,所以我们这个位置需要改的信息应符合我们这个omapl-g++这个文件夹的名字

      在Qt根目录下:vim ./src/corelib/io/io.pri

      找到linux-*这一块,然后改成inux-*|omap*{

      这个意思就非常明显了,我们在mkspec/qws创建的文件夹的名字叫做omapl-g++ 那么需要在这里制定信息也是要匹配这个名字的,所以增加omap*这样的通配符,如果你是在mkspec/qws中创建的是zynq-g++ 那么显而易见那么增加的应该是zynq*或者zynq-g*都行。

    4)开始编译

    执行命令启动编译:(8线程编译,如果你的CPU受不住8线程你可以用双线程 -j2参数,-几就是几线程编译)

    sudo make -j4
    

    我的大概能编译10分钟左右,此时CPU利用率达到100%,温度如果是笔记本的话,超级高。编译时间根据你的配置多少来决定。编译的过程不可能是一帆风顺的,总会出现各种各样的错误,如果出现编译错误,那么就去百度解决。
    编译结束后,执行安装命令:

    sudo make install
    

    我们切换到-prefix设定的目标目录下看看是否安装成功:

    cd /home/delvis/work/qt-arm-4.8.6
    ls
    

    如果在bin目录出现了qmake基本上就成功了。

    配置PC的QtCreator

    这个部分不在赘述,我找到http://blog.csdn.net/u012175418/article/details/52704734 引用这个博客的“设置QT的交叉编译环境”,部分,按照这个步骤在PC机的Qt上面配置好我们刚编译的组件和刚刚编译Qt的交叉编译环境。

    拷贝文件到目标板并配置环境

    1)传输Qt4.8.6到开发板

    就是把我们刚才编译的环境拷贝到我们的目标板的目录下,可以使用FTP,可以使用OTG挂在U盘的方式,我喜欢使用SSH协议的scp命令。

    sudo scp -r /home/delvis/work/qt-arm-4.8.6 root@192.168.2.103:/opt 输入密码之后就可以把整个文件夹传输到开发板上面了。

    2) 配置开发板的环境

    我们传输完毕之后,则需要在开发板上设定环境,当我们运行qt程序的时候才能寻找到这些Qt库文件。

    打开

    vi /etc/profile

    增加以下,需要注意的是QT_ROOT,写对Qt的路径,还有TSLIB_ROOT编译的是tslib的路径。

    export TSLIB_ROOT=/opt/tslib1.4                                                 
    export QT_ROOT=/opt/qt-arm-4.8.6                                                
    export TSLIB_TSDEVICE=/dev/input/event2                                         
    export TSLIB_TSEVENTTYPE=input                                                  
    export TSLIB_CONFFILE=/opt/tslib1.4/etc/ts.conf                                 
    export TSLIB_PLUGINDIR=/opt/tslib1.4/lib/ts                                     
    export TSLIB_CONSOLEDEVICE=none                                                 
    export TSLIB_FBDEVICE=/dev/fb0                                                  
    export QWS_MOUSE_PROTO=tslib:/dev/input/event2                                  
    export LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib:$QT_ROOT/lib:$TSLIB_ROOT/lib
    export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins
    export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0
    export QT_QPA_FONTDIR=$QT_ROOT/lib/fonts
    export QT_QPA_GENERIC_PLUGINS=tslib 
    

    完成之后,更新一下环境。

    source /etc/profile

    完成配置。

    3)测试

    我们利用Qt Creator制作一个简单的界面,然后编译出可执行文件,讲可执行文件传输到目标板子上面执行,我们的可执行程序叫做TestEM,需要qws参数。

    ./TestEM -qws

    然后就可以看见界面了。

    界面文件

    参考文献:

    [1] 德州仪器手册. Building_Qt. 德州仪器WIKI.

    [2] Qt官网forum. Error in cross compilation for ARM OMAP35x development kit). Qt官方Forum.

    [3] BigSam78. ARM 指令集版本和ARM 版本. 新浪博客.


    版权声明:

    1. 本文为MULTIBEANS团队研发跟随文章,未经允许不得转载。

    2· 文中涉及的内容若有侵权行为,请与本人联系,本人会及时删除。

    3· 尊重成果,本文将用的参考文献全部给出,向无私的工程师,爱好者致敬。

  • 相关阅读:
    AtCoder Regular Contest 093
    AtCoder Regular Contest 094
    G. Gangsters in Central City
    HGOI 20190711 题解
    HGOI20190710 题解
    HGOI 20190709 题解
    HGOI 20190708 题解
    HGOI20190707 题解
    HGOI20190706 题解
    HGOI 20190705 题解
  • 原文地址:https://www.cnblogs.com/sigma0/p/8168313.html
Copyright © 2011-2022 走看看