• 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· 尊重成果,本文将用的参考文献全部给出,向无私的工程师,爱好者致敬。

  • 相关阅读:
    那些ubuntu创建用户踩过的坑
    Build tools
    version control(以git为例)讲解
    URI和URL的区别
    HTTP解析过程心得
    函数式编程(functional programming)
    cb45a_c++_STL_算法_删除_(3)_unique(唯一的意思)删除连续性的重复的数据
    cb44a_c++_STL_算法_删除_(2)remove_copy_remove_copy_if
    cb43a_c++_STL_算法_删除_(1)remove_remove_if
    cb42a_c++_STL_算法_替换_replace
  • 原文地址:https://www.cnblogs.com/sigma0/p/8168313.html
Copyright © 2020-2023  润新知