Qt4.8.6 Embedded Linux 的编译与移植
最近买了个飞凌ok6410 的开发板,于是在其中搭建qt4.8.6运行环境。费了两三天时间,主要还是对Linux系统的生疏,在一些问题上徘徊很久,在这里做一些过程笔记。烧写ARM-Linux系统,根据飞凌官方的用户手册成功为开发板烧写了U-boot、kernel3.0.1、以及rootfs.yaffs(均由飞凌官方提供)。
编译环境:
PC:Ubuntu12.04 LTS,Vmware Workstation 10.0.5 build-2443746
Qt:4.8.6 qt-everywhere-opensource-src-4.8.6.tar.gz
tslib:未使用开发板提供的tslib1.4
交叉编译器:arm-linux-gcc-4.3.2
编译准备:
1.依赖包安装
纯净版的Ubuntu没有g++需要先安装:
- apt-get install g++
apt-get install g++
另外很多参考资料中安装如下几个依赖包:libX11-dev libXext-dev libXtst-dev,虽然不知道具体依赖关系,安装上总不会错。命令:
- apt-get install libX11-dev libXext-dev libXtst-dev
apt-get install libX11-dev libXext-dev libXtst-dev
2.交叉编译器:
最开始采用arm-linux-gcc-4.4.3版本交叉编译qt4.8.6的过程十分顺利,但将库移植到ok6410开发板后,运行使用qt4.8.6编译的程序,报错:GLIBC2.9 not found,经过多番查实,主要问题在于飞凌官方提供的文件系统所使用的glibc(2.8)与Ubuntu12.04的glibc(2.15)的版本不匹配,于是试图去升级开发板glibc版本,但水平有限无果(如果没有把握自己定制内核、文件系统,而且时间紧迫的情况下,不建议去折腾,学习目的除外)。最后交叉编译器使用的是4.3.2版本
3.关于tslib版本的几点说明:
最开始使用的是开发板提供的tslib1.4,tslib的交叉编译安装过程十分简单。但在移植qt库和环境变量后,运行交叉编译的qt程序,arm开发板显示屏可以呈现程序界面,说明qt库移植基本OK,但触摸屏无法移动,并且超级终端显示错误 "Couldnt load module pthres QWSTslibMouseHandlerPrivate: ts_config() failed with error: 'No such file or directory' Please check your tslib installation!",网上一些资料提到可能是开发板提供的tslib版本太旧了,抱着试一试的心态,下载了最新的tslib,最后就没出现上述问题,也说明了我的环境变量设置的正确性。
这样获得的tslib源代码是最新的,目前是稳定版本。
Tslib和Qt在开发板上的移植
主要参考博客:
http://www.cnblogs.com/Jasonsblog/p/3757985.html或者http://www.cnblogs.com/emouse/archive/2013/01/29/2881311.html;
另外风间一叶的《linux arm Qt 移植配置 一键推送远程调试 视频教程 》;
qt4.8.6编译过程中遇到的问题:
1)缺少链接库:
- /usr/local/tslib/lib/libts.a(ts_load_module.o): In function `__ts_load_module':
/usr/local/tslib/lib/libts.a(ts_load_module.o): In function `__ts_load_module':
- ts_load_module.c:(.text+0x80): undefined reference to `dlopen'
ts_load_module.c:(.text+0x80): undefined reference to `dlopen'
- ts_load_module.c:(.text+0x90): undefined reference to `dlsym'
ts_load_module.c:(.text+0x90): undefined reference to `dlsym'
- ts_load_module.c:(.text+0xf0): undefined reference to `dlclose'
ts_load_module.c:(.text+0xf0): undefined reference to `dlclose'
- ts_load_module.c:(.text+0x120): undefined reference to `dlclose'
ts_load_module.c:(.text+0x120): undefined reference to `dlclose'
- ts_load_module.c:(.text+0x158): undefined reference to `dlclose'
ts_load_module.c:(.text+0x158): undefined reference to `dlclose'
- collect2: ld returned 1 exit status
collect2: ld returned 1 exit status
- make[1]: *** [../../lib/libQtGui.so.4.8.6] 错误 1
make[1]: *** [../../lib/libQtGui.so.4.8.6] 错误 1
- make[1]:正在离开目录 `/lsj_pro/qt-everywhere-opensource-src-4.8.6/src/gui'
make[1]:正在离开目录 `/lsj_pro/qt-everywhere-opensource-src-4.8.6/src/gui'
- make: *** [sub-gui-make_default-ordered] 错误 2
make: *** [sub-gui-make_default-ordered] 错误 2
解决方案:
修改./src/gui/Makefile
- ...
- LIBS = $(SUBLIBS) -L/usr/local/tslib-1.4/lib -L/home/work/qt/qt-4.7.0-arm/lib -lQtNetwork -L/usr/local/tslib-1.4/lib -L/home/work/qt/qt-4.7.0-arm/lib -lQtCore -lpthread -lts
- ...
...
LIBS = $(SUBLIBS) -L/usr/local/tslib-1.4/lib -L/home/work/qt/qt-4.7.0-arm/lib -lQtNetwork -L/usr/local/tslib-1.4/lib -L/home/work/qt/qt-4.7.0-arm/lib -lQtCore -lpthread -lts
...在末尾添加库libdl库,这个库用于动态连接库的操作:
- ...
- LIBS = $(SUBLIBS) -L/usr/local/tslib-1.4/lib -L/home/work/qt/qt-4.7.0-arm/lib -lQtNetwork -L/usr/local/tslib-1.4/lib -L/home/work/qt/qt-4.7.0-arm/lib -lQtCore -lpthread -lts -ldl
- ...
...
LIBS = $(SUBLIBS) -L/usr/local/tslib-1.4/lib -L/home/work/qt/qt-4.7.0-arm/lib -lQtNetwork -L/usr/local/tslib-1.4/lib -L/home/work/qt/qt-4.7.0-arm/lib -lQtCore -lpthread -lts -ldl
...
保存后退出,切换至源码目录下继续make -j4。
2)undefined reference to `__sync_sub_and_fetch_4':
造成这个原因主要是gcc版本问题。
解决方案(http://blog.csdn.net/zpzkitt/article/details/8970626):
1.下载gcc源码:我后来使用的4.4.3的(系统自带的gcc-4.6.3的貌似用不成),解压,在gcc-4.4.3/gcc/config/arm/目录下找到一个linux- atomic.c;
2.制作链接库:使用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=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 --tag=CC --mode=link arm-linux-g++ -g -O2 -o liblinux-atomic.la linux-atomic.lo这一步会在当前目录生成.libs目录;
3.将生成的库拷贝到一个比较短的目录,比如/opt:
- cp .libs/liblinux-atomic.a /opt
cp .libs/liblinux-atomic.a /opt4.修改Qt的Makefile:
进入Qt源码目录:
cd qt-everywhere-opensource-src-4.8.6
然后:vim src/script/Makefile
修改:在LIBS = 。。。。。。。。。。。。。的结尾添加-L/opt -llinux-atomic
保存,继续make -j4,最后执行make install就OK了。
移植库至开发板并设置环境变量
- /usr/local/tslib/etc/ts.conf拷贝至开发板/etc/,切换至/usr/local/tslib/lib/目录,将除pkconfig目录外的文件拷贝至开发板/lib/;
- 打包qt库,我用了别人写好的一个脚本mk_qt4_target,打包好在当前目录生成压缩包target-qte-4.8.6.tar.bz2,拷贝至开发板根目录,解压即可在/usr/local/下看到需要的qt库文件;
- 环境变量脚本qt4_en.sh,内容如下:
- #!/bin/sh
- if [ -c /dev/input/event2 ]; then
- INPUT_PATH=/dev/input
- else
- INPUT_PATH=/dev
- fi
- export TSLIB_TSDEVICE=/dev/input/event2
- export TSLIB_CONFFILE=/etc/ts.conf
- export TSLIB_PLUGINDIR=/lib/ts
- export TSLIB_CALIBFILE=/etc/pointercal
- export QTDIR=/usr/local/Trolltech/QtEmbedded-4.8.6-arm/
- export PATH=$QTDIR/bin:$PATH
- export LD_LIBRARY_PATH=$QTDIR/lib
- export QWS_MOUSE_PROTO="Tslib:$INPUT_PATH/event2"
- #export QWS_MOUSE_PROTO="Tslib:$INPUT_PATH/event2 MouseMan:$INPUT_PATH/mouse1"
- export QWS_KEYBOARD=TTY:/dev/tty1
- #sync font size with QtDesigner
- export QWS_DISPLAY="LinuxFB:mmWidth200:0"
- export QWS_SIZE="480x272"
- export KDEDIR=/opt/kde
- export HOME=/root
#!/bin/sh
if [ -c /dev/input/event2 ]; then
INPUT_PATH=/dev/input
else
INPUT_PATH=/dev
fi
export TSLIB_TSDEVICE=/dev/input/event2
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/lib/ts
export TSLIB_CALIBFILE=/etc/pointercal
export QTDIR=/usr/local/Trolltech/QtEmbedded-4.8.6-arm/
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib
export QWS_MOUSE_PROTO="Tslib:$INPUT_PATH/event2"
#export QWS_MOUSE_PROTO="Tslib:$INPUT_PATH/event2 MouseMan:$INPUT_PATH/mouse1"
export QWS_KEYBOARD=TTY:/dev/tty1
#sync font size with QtDesigner
export QWS_DISPLAY="LinuxFB:mmWidth200:0"
export QWS_SIZE="480x272"
export KDEDIR=/opt/kde
export HOME=/root
以上是我的开发板配置,具体的设置还需要根据开发板硬件做相应的修改。
运行测试:
在QtCreator3.3.0中设计简单UI,并编译拷贝至开发板运行,应用程序名:helloworld
运行:
- ./helloword -qws

./helloword -qws
效果如下,点击触摸屏有反应,鼠标箭头可以移动
Qt4.8.6 Embedded Linux 的编译与移植的更多相关文章
- Fedora 11中用MinGW编译Windows的Qt4程序(在Linux系统下编译Windows的程序)
Ubuntu下可以直接安装: sudo apt-get install mingw32 mingw32-binutils mingw32-runtime 安装后编译程序可以: i586-mingw32 ...
- Linux 下编译、安装、配置 QT
转自Linux 下编译.安装.配置 QT 注意:编译安装耗时费力,且很容易出错,要不断调整编译参数,不推荐使用,否则这将会是一个纠结痛苦的过程. 打算做嵌入式图像处理,计划方案嵌入式Linux+Ope ...
- Linux下编译Qt源码,一定要下载tar.gz版本,否则会报权限不足
首先下载qt-everywhere-opensource-src-4.8.1源码,下载地址: ftp://ftp.qt-project.org/qt/source/ 在Linux下编译一定要下载qt- ...
- Qt for Embedded Linux
1. Qt for Embedded Linux http://doc.qt.io/qt-5/embedded-linux.html 2. Installing Qt for Embedded Lin ...
- 构建自己的embedded linux系统
[教程]使用buildroot完全自定义自己的embedded linux系统(nand)http://www.eeboard.com/bbs/thread-38377-1-1.html [教程] [ ...
- Linux 下编译并安装配置 Qt 4.53全过程
最近准备做 Nokia 的 Symbian,Maemo 下触摸屏开发.考虑到程序的跨平台可移植性,最终选择使用 Qt 开发.相对来说,国内关于 Qt 相关文档并不算很多.作者将 Linux 下编译并安 ...
- 沁恒CH32V103C8T6(二): Linux RISC-V编译和烧录环境配置
目录 沁恒CH32V103C8T6(一): 核心板焊接和Windows开发环境配置 沁恒CH32V103C8T6(二): Linux RISC-V编译和烧录环境配置 硬件准备 CH32V103 开发板 ...
- linux下编译gcc6.2.0
linux下编译gcc6.2.0 在archlinx的下gcc已经更新到6.2.1了,win10的WSL下还是gcc4.8.官方源没有比较新的版本,于是自己编译使用. GCC6的几个新特性 GCC 6 ...
- LINUX下编译安装PHP各种报错大集合
本文为大家整理汇总了一些linux下编译安装php各种报错大集合 ,感兴趣的同学参考下. nginx1.6.2-mysql5.5.32二进制,php安装报错解决: 123456 [root@clien ...
随机推荐
- 更新日志 - BugHD 全面开放 API 文档
Hey, 上周 BugHD 全面更新 API 文档,上线一些新的功能,让你可以轻松掌控 Crash ,更方便分享.定位和解决.同时,新版 fir.im 也有所优化,希望你们会喜欢. 具体如下: 开放 ...
- iOS开发之静态库(二)—— .a
前面已经介绍了iOS中静态库的基本概念和特点,这里就不再多废话,直接上代码 编译环境Xcode5.1 + Mac OS X 10.9.3 新建静态库项目 Xcode中创建静态库的模板有两个,一个是创建 ...
- iOS-APP发布应注意要点
Android和IOS的app发布的流程有一个相同之处,就是都需要先将编译好的app签名,然后上传到market里,但两者的复杂度是冰火两重天.Android可以手动通过集成在eclipse里的工具进 ...
- asp.net对cookie的操作
创建cookie: HttpCookie cookie = new HttpCookie("CurrentUser"); //创建一个名称为CurrentUser 的cookie对 ...
- Null Object模式
去除代码中的if(obj==null),或者try/catch语句.维持Code的一致性. Null对象,代表"什么也不做"的一个对象. 使Null对象称为一个匿名内部类确保了该类 ...
- 定义一个时钟类——Clock,它包括三个int型 成员变量分别表示时、分、秒,一个构造方法用于对三个成员变量(时、分、秒) 进行初始化,还有一个成员方法show()用于显示时钟对象的时间。其次,再定义 一个主类——TestClass,在主类的main方法中创建多个时钟类的对象,使用这 些对象调用方法show()来显示时钟的时间
package java1; public class Clock { int hhh; int mmm; int sss; Clock(int h,int m,int s) { hhh=h; mmm ...
- webRTC-实时流媒体的福音
WebRTC是一项在浏览器内部进行实时视频和音频通信的技术,是谷歌2010年以6820万美元收购Global IP Solutions公司而获得的一项技术.[1] WebRTC实现了基于网页的视频会议 ...
- [转] 配置Log4j
Log4J的配置文件(Configuration File)就是用来设置记录器的级别.存放器和布局的,它可接key=value格式的设置或xml格式的设置信息.通过配置,可以创建出Log4J的运行环境 ...
- 闲聊Redshift与日本CG行业的近况
最近不少朋友跟我说Redshift如何如何,恰巧我目前工作的工作室花费了巨资购买了Redshift和Quadro M4000,妄图在艺术家工作站上做一个新的动画项目,把渲染时间控制在15分钟以下.结果 ...
- sonar的安装与代码质量检测实例
说明:sonar依赖数据库. mysql优化 1.笔者使用的是mysql数据库.首先对mysql做简单的优化配置. [root@localhost bin]# cat /etc/my.cnf [mys ...
