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

posted @ 2018-01-01 18:38  Carlos·Wei  阅读(825)  评论(1编辑  收藏  举报