Qt在嵌入式开发板上的移植

移植Qt就是移植Qt的库,这是移植之前我们得知道的


废话不多说,首先说一下我的开发环境

1、Qt下载地址
(1)QT官网:https://www.qt.io/
(2)QT源码及各种资源的下载主站:http://download.qt.io/archive/qt/

mingw:minst gcc for windows,在Windows中运行的gcc编译器,如果想把linux中的软件移植到windows中就可以借助mingw。

64位虚拟机可以直接下载.run文件,直接运行就能下载。32位的要把运行环境和IDE分开下


板子:s5pv210(九鼎公司)
ubuntu版本:16.04
交叉编译工具链:arm-2009q3(九鼎公司配套提供)

移植前准备和确认:
1、uboot编译OK
2、内核编译OK
3、rootfs搭建OK(没有报错)
4、开发板的触摸屏驱动没有问题

cat /proc/bus/input/device            ls /dev/input/event2

cat /dev/input/event   用手触摸触摸屏,会有乱码产生

也可以写代码测试

5、设置bootcmd bootargs 用tftp和nfs方式启动

bootcmd=tftp 30008000 zImage;bootm 30008000
bootargs=root=/dev/nfs nfsroot=192.168.1.141:/root/x210_portting/rootfs/rootfs ip=192.168.1.10:192.168.1.141:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC2,115200


一、编译tslib
我这里用的是tslib-1.4

放到/root/x210_portting/QT5.x_Porting/tslib
解压后执行下面的命令,最终我们的Qt
# cd tslib
# ./autogen.sh

如果./autogen.sh时报错:./autogen.sh: 4: autoreconf: not found,是因为系统中没有安装autoconf工具,解决方法:先让ubuntu能上网,然后执行:sudo apt-get install autoconf automake libtool


# echo "ac_cv_func_malloc_0_nonnull=yes">arm-linux.cache 
# mkdir /opt/tslib  tislib安装目录
# ./configure --prefix=/opt/tslib --host=arm-linux --cache-file=arm-linux.cache  //arm-linux 你自己的交叉编译工具链符号链接
# make
# make install
注意一下我这里的profix,这是我们make install的安装路径
将安装目录下的所有文件都拷贝到我们的rootfs下的tslib去

部署 

(1)部署库文件

在/opt/tslib/lib下的lib文件放到根文件下的lib中。为了省事,直接把tslib文件直接复制粘贴到根文件系统下

 
导出环境变量到/etc/profile文件里面去export TSLIB_TSDEVICE=/dev/input/event2
export TSLIB_CALIBFILE=/tslib/etc/pointercal
export TSLIB_CONFFILE=/tslib/etc/ts.conf
export TSLIB_PLUGINDIR=/tslib/lib/ts
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/tslib/lib
export TS_INFO_FILE=/sys/class/input/input2/uevent


还有/dev /input/event?我们可以测试
方法一:
cat /dev/input/event0一直试到最后,看看哪个是适合我们的
方法二:
cat /proc/bus/input/devices看我们触摸屏型号对应的是event几


然后进入tslib的bin目录
执行./ts_calibrate
如果出现tslib的触摸屏五点校准画面,至此,tslib的安装移植成功完成。


会出现的错误:
错误1:
-/bin/sh: ./ts_calibrate: not found
这是因为ts_calibrate并不是静态编译的,所以它没有对应的库
我们只需要把交叉编译工具链下的库都cp进/lib目录下就OK了
我这里的库是:
cp /usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib/* . -r


错误2:
No raw modules loaded.
ts_config: No such file or directory
解决:在etc/ts.config打开 module_raw input 


错误3:selected device is not a touchscreen I understand
是由于内核和编译器的一个宏定义不一致导致的,vi include/Linux/input.h  EV_VERSION 为 0x0100000 ,从新编译内核特别是触摸驱动。


参考文献1:http://blog.163.com/zhuandi_h/blog/static/180270288201222310291262/
参考文献2:http://blog.csdn.net/lizuobin2/article/details/52673494


二、Qt5.6.2的源码编译
配置

/root/x210_portting/QT5.x_Porting/qt5.6.3 存放Qt编译器

/opt/QT5.6.3 安装目录
1、配置相应的qmake
vi qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf
//文件末尾加入下面三行
QT_QPA_DEFAULT_PLATFORM = linuxfb
QMAKE_CFLAGS_RELEASE   += -O2  -march=armv7-a   
QMAKE_CXXFLAGS_RELEASE += -O2  -march=armv7-a
//并修改以下
//arm-linux-xxx是我们交叉编译工具链的东西
//-lts添加tslib的依赖
# modifications to g++.conf
QMAKE_CC = arm-linux-gcc -lts
QMAKE_CXX = arm-linux-g++ -lts -ldl    
QMAKE_LINK = arm-linux-g++ -lts -ldl
QMAKE_LINK_SHLIB = arm-linux-g++ -lts -ldl
# modifications to linux.conf
QMAKE_AR = arm-linux-ar cqs 
QMAKE_OBJCOPY = arm-linux-objcopy 
QMAKE_NM = arm-linux-nm -P
QMAKE_STRIP = arm-linuxi-strip 


编译前配置(可以参考./configure --help的提示来配置)
./configure  -prefix /opt/QT5.6.2  \
  -opensource  \
  -confirm-license \
  -release  \
  -shared  \
  -accessibility \
-c++std c++98 \
  -xplatform linux-arm-gnueabi-g++ \
-qpa linuxfb \
-linuxfb \
-qreal float \
-pch \
-qt-zlib \
  -qt-libjpeg \
          -qt-libpng \
-no-sse2 \
          -no-largefile \
          -no-qml-debug \
          -no-glib \
-no-gtkstyle \
  -no-opengl \
  -nomake tools \
  -nomake examples \
  -tslib \
  -skip qt3d -skip qtcanvas3d -skip qtdoc -skip qtwayland \
  -I /opt/tslib/include \
  -L /opt/tslib/lib


注意:
我们的交叉编译工具链只支持c++98并不支持c++11
而我们在我们Qt源码目录下./configure --help
我们发现5.6支持c++98而5.9不支持

  
编译中的错误解决
(1)找不到dlopen或者dlsym
   在编译器后面加ldl arm-linux-g++ -ldl
(2)undefined reference to `__sync_add_and_fetch_4'
  参考http://www.mamicode.com/info-detail-1699895.html

/root/x210_portting/QT5.x_Porting/linux-atomic 吧 linux-atomic.c复制过来
  apt-get install libtool
  libtool --tag=CC --mode=compile arm-linux-gcc -g -O2 -MT linux-atomic.lo -MD -MP -MF linux-atomic.Tpo -c -o linux-atomic.lo linux-atomic.c 
  libtool --tag=CC --mode=link arm-linux-g++ -g -O2 -o liblinux-atomic.la linux-atomic.lo
  利用libtool生成liblinux-atomic.a,注意生成的目录名叫.libs所以是隐藏的


  创建/opt/linux-atomic
  cp .libs/liblinux-atomic.a /opt/linux-automic    // 注意/opt/linux-automic是自己事先创建的
  在QT源码下修改:./qtscript/src/script/Makefile
  在LIBS  = 的结尾添加 -L/opt/linux-atomic -llinux-atomic

/opt/Qt5.3.2 IDE的安装目录
配置交叉编译

先添加Qt Versions  再添加Complilers再添加kits

Qt Versions add  /opt/bin/qmake

Complilers path添加交叉编译工具链的路径

Kits中Complier选我们添加的

编译好的程序在/opt/Qt5.3.2/Myapp/build-Text1-arm-Debug  中的Text1

编译好之后我们去/opt下的QT5.6.2下去把lib和plugins都拷到我们根文件系统里面去 新建一个Qt5.6.2
cp lib /root/x210_port/qt_rootfs/rootfs/Qt5.6.2/ -r
cp plugins/ /root/x210_port/qt_rootfs/rootfs/Qt5.6.2/ -r


在根文件系统下导出环境变量
export QT_ROOT=/Qt5.6.2
export LD_LIBRARY_PATH=$QT_ROOT/lib:$LD_LIBRARY_PATH
export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins   
export QT_QPA_FONTDIR=$QT_ROOT/lib/fonts            
export QT_QPA_FB_TSLIB=1    
export QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/event2          
export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size=1024x600:mmSize=1024x600:offset=0x0:tty=/dev/tty1


错误1:error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory
解决:C++库在交叉编译工具链中,复制进去即可。
/usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/thumb2/usr/lib# cp libstdc++.*so* /root/x210_portting/rootfs/rootfs/lib/ -f

 


QIconvCodec::convertFromUnicode: using Latin-1 for conversion, iconv_open failed
QIconvCodec::convertToUnicode: using Latin-1 for conversion, iconv_open failed
大概是缺少 libiconv  


下载 链接:http://pan.baidu.com/s/1c22xb4O 密码:pbld

/root/x210_portting/QT5.x_Porting/libiconv 在这里面解压 运行 ./configure -prefix=$PWD/_install --host=arm-none-linux-gnueabi

移植libiconv中遇到的问题及解决:
1、./stdio.h:1010:1: error: ‘gets’ undeclared here (not in a function)
 _GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
解决:找到那一行,注释掉。

/root/x210_portting/QT5.x_Porting/libiconv/libiconv-1.14/srclib 中stdio.h 输入三次gets 就会找到想找的那句话

无法make install 、编译好的库是intel80386架构的,不是ARM的,不能用,要交叉编译才行。

解决:先看配置好的Makefile,找交叉编译工具链的全局变量。但是本项目的Makefile中没有CC等这些定义,像这种一般就是通过环境变量来设置的。

make CROSS_COMPILE=arm-linux-none-gnueabi- ARCH=arm

make install 

cd _install    cp  /preloadable_libiconv.so /root/rootfs/lib

开发板上导出

export LD_PRELOAD=/lib/preloadable_libiconv.so

Qt应用程序是在/opt/Qt5.3.2/Tools/QCrearter/bin/ 去执行./qtcreater
 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值