参考链接:
tslib1.4与Qt4.8.6的交叉编译与移植
http://www.cnblogs.com/Jasonsblog/p/3757985.html
Tslib和Qt 4.8.4与在开发板上的移植
http://www.cnblogs.com/emouse/archive/2013/01/29/2881311.html
目的:使自己在Ubuntu下的qtcreator3.5.0生成的界面,通过qt4.8.6交叉编译,gcc4.4.3交叉编译,得到一个可执行qt程序,并将其放到开发板下,执行;
tslib编译与安装
触摸屏软件 tslib1.4.tar.gz tslib是触摸屏校准的库,这个是tslib源码,可以移植到嵌入式设备中对触摸屏进行校准在采用触摸屏的移动终端中,触摸屏性能的调试是个重要问题之一,因为电磁噪声的缘故,触摸屏容易存在点击不准确、有抖动等问题。
Tslib是一个开源的程序,能够为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能,通常作为触摸屏驱动的适配层,为上层的应用提供了一个统一的接口。在Qtopia 4.*版本中,默认的Tslib版本为Tslib 1.4。在Qtopia 2.*版本中,默认的Tslib版本为Tslib 1.3
1.解压缩:tar -zxvf tslib1.4.tar.gz
2.运行./autogen.sh
./autogen.sh: 4: autoreconf: not found
是在不同版本的 tslib下执行autogen.sh产生。它们产生的原因一样,是因为没有安装
automake 工具, (ubuntu 8.04)用下面的命令安装好就可以了。
sudo apt-get install autoconf automake libtool
3.运行
./configure --host=arm-linux --prefix=/opt/tslib-1.4 ac_cv_func_malloc_0_nonnull=yes
4.make
在make时出错,提示
In function ‘open’,
inlined from ‘main’ at ts_calibrate.c:229:11:
/usr/include/bits/fcntl2.h:51:24: error: call to ‘__open_missing_mode’ declared with attribute error: open with O_CREAT in second argument needs 3 arguments
make[2]: *** [ts_calibrate.o] Error 1
解决方法:
这是因为open函数的语法不符合最新的gcc,在/tests/ts_calibrate.c中加入open的第三个参数0777:
if ((calfile = getenv("TSLIB_CALIBFILE")) != NULL) {
cal_fd = open (calfile, O_CREAT | O_RDWR, 0777);
} else {
cal_fd = open ("/etc/pointercal", O_CREAT | O_RDWR, 0777);
}
5.make install
编译安装成功如下图:
tslib的开发板移植与测试
将交叉编译的tslib安装到开发板上其实就是拷贝相关的文件并添加系统环境变量而已,所以相对操作较为简单,主要的就是需要找对目录就行。
按照上面的操作方法,交叉编译安装后的文件在/usr/local/tslib目录下,因此需要拷贝的文件如下:
1./usr/local/tslib/lib文件下除去pkgconfig目录外其他所有文件拷贝到开发板/lib目录下
2./usr/local/tslib/etc下的ts.conf拷贝到开发板的/etc下,在复制对应目录之前修改文件如下,也可以复制完成后修改。
下面是ts.conf文件的第一行与第二行
# Uncomment if you wish to use the linux input layer event interface
# module_raw input
去掉# module_raw input前面的注释,一定要注意中间的空格也去掉,module顶格。
最后添加环境变量,通过超级终端在开发板系统中添加环境变量,可以在开发板文件系统的/etc/profile文件里添加,也可以直接添加。
export TSLIB_TSDEVICE=/dev/input/touchscreen0
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/lib/ts
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
说明:
TSLIB_TSDEVICE //触摸屏设备文件名。
TSLIB_CALIBFILE //校准的数据文件,由ts_calibrate校准程序生成。
SLIB_CONFFILE //配置文件名。
TSLIB_PLUGINDIR //插件目录
TSLIB_CONSOLEDEVICE //控制台设备文件名
TSLIB_FBDEVICE //设备名
以上环境变量在实际开发中的实际配置可以根据实际情况决定。而这些指定的设备节点一定要和你的开发板上的/dev目录下的设备节点相对应。
最后运行测验程序
ts_calibrate 进行校验
ts_test 进行测试
测试结果如下图所示:
说明:这里用的交叉编译工具链是网上下载的arm-linux-gcc (version4.3.2)版本;
QT 的交叉编译与安装
软件平台
Linux:Ubuntu 15.04(32位,尽量用32位的,不然还得安装32位的库文件。)
qt-library:4.8.6
qt-creator:3.5.0
Linux version: 3.19
交叉编译工具链:arm-linux-gcc (version 4.3.2)
开发板版本:
AT91 SAM9G45:Linux version 3.6.9 + gcc version 4.2.2
和PC平台下的编译类似,通过运行./configure进行配置生成makefile文件,然后编译安装,只是因为是针对嵌入式平台需要进行一些针对性配置,这里生成一个自动配置文件,可以通过修改文件来方便的更改配置。
1.下载QT4.8.6,
qt-everywhere-opensource-src-4.8.6 .tar.gz
http://mirrors.ustc.edu.cn/qtproject/archive/qt/4.8/4.8.6/
2.进入:/etc/profile,确保现在的编译工具是g++;
3.# cd qt-everywhere-opensource-src-4.8.6
#sudo gedit autoconfig.sh
加入以下内容保存.
#!/bin/sh
./configure \
-opensource \
-confirm-license \
-release -shared \
-embedded arm \
-xplatform qws/linux-arm-g++ \
-depths 16,18,24,32 \
-fast \
-optimized-qmake \
-pch \
-qt-sql-sqlite \
-qt-libjpeg \
-qt-zlib \
-qt-libpng \
-qt-freetype \
-little-endian -host-little-endian \
-no-qt3support \
-no-libtiff -no-libmng \
-no-opengl \
-no-mmx -no-sse -no-sse2 \
-no-3dnow \
-no-openssl \
-no-webkit \
-no-qvfb \
-no-phonon \
-no-nis \
-no-opengl \
-no-cups \
-no-glib \
-no-xcursor -no-xfixes -no-xrandr -no-xrender \
-no-separate-debug-info \
-nomake examples -nomake tools -nomake docs \
-qt-mouse-tslib \
-I/usr/local/tslib/include \
-L/usr/local/tslib/lib
exit
-embedded arm: 表示将编译针对 arm平台的embedded版本;
-xplatform qws/linux-arm-g++: 表示使用 arm-linux交叉编译器进行编译;
-qt-mouse-tslib: 表示将使用 tslib来驱动触摸屏;
运行脚本
#sudo chmod +x autoconfig.sh
#./autoconfig.sh
如果在configure时出错,提示
You might need to modify the include and library search paths by editing QMAKE_INCDIR and QMAKE_LIBDIR in/home/Raymond/qt-embedded-arm-tslib/mkspecs/qws/linux-arm-g++.
解决办法:
是arm-linux-gcc的路径没有添加到系统变量中
解决办法:
a.是arm-linux-gcc的路径没有添加到系统变量中:/etc/profile
b.往最后两行加了QMAKE的目录和库路径:
c.如果编译出现缺少链接信息错误:
warning: libts-0.0.so.0, needed by , not found (try using -rpath or -rpath-link)
undefined reference to `ts_read_raw'
undefined reference to `ts_open'
undefined reference to `ts_fd'
undefined reference to `ts_config'
undefined reference to `ts_close'
undefined reference to `ts_read'
collect2: ld returned 1 exit status
解决方法如下:
修改qt-everywhere-opensource-src-4.8.6/mkspecs/qws/linux-arm-g++/qmake.conf 文件(添加lts参数):
QMAKE_CC = arm-linux-gcc -lts
QMAKE_CXX = arm-linux-g++ -lts
QMAKE_LINK = arm-linux-g++ -lts
QMAKE_LINK_SHLIB = arm-linux-g++ -lts
2. make
如果出现如下错误:
cc1:error:.pch/release-shared-emb-arm/QtGui:NO such file or directory
在配置时添加参数: -no-pch
如果出现如下错误:
make[1]: 正在进入目录 `/home/duliqun/qt-everywhere-opensource-src-4.8.6/src/corelib'
g++ -c -include .pch/release-shared-emb-arm/QtCore -pipe -I/opt/tslib-1.0/include -fno-exceptions -O2 -fvisibility=hidden -fvisibility-inlines-hidden -Wall -W -D_REENTRANT -fPIC -DQT_SHARED -DQT_QLOCALE_USES_FCVT -DQT_BUILD_CORE_LIB -DQT_NO_USING_NAMESPACE -DQT_NO_CAST_TO_ASCII -DQT_ASCII_CAST_WARNINGS -DQT3_SUPPORT -DQT_MOC_COMPAT -DQT_USE_QSTRINGBUILDER -DELF_INTERPRETER=\"\" -DHB_EXPORT=Q_CORE_EXPORT -DQT_NO_DEBUG -I../../mkspecs/linux-g++ -I. -I../../include -I../../include/QtCore -I.rcc/release-shared-emb-arm -Iglobal -I../3rdparty/zlib -I../3rdparty/harfbuzz/src -I../3rdparty/md5 -I../3rdparty/md4 -I.moc/release-shared-emb-arm -o .obj/release-shared-emb-arm/qabstractanimation.o animation/qabstractanimation.cpp
../../include/QtCore/../../src/corelib/arch/qatomic_armv5.h: Assembler messages:
../../include/QtCore/../../src/corelib/arch/qatomic_armv5.h:131: Error: no such instruction: `swpb %cl,%dl,[%ebp]'
../../include/QtCore/../../src/corelib/arch/qatomic_armv5.h:131: Error: no suchinstruction: `swpb %dl,%sil,[%ebp]'
可能是arm 交叉环境有问题,如果配置好了一般reconfigure下就ok.如果总是有问题,可以修改qatomic_armv5.h,将汇编用c code写可以避过这个错误。
vi /home/duliqun/qt-everywhere-opensource-src-4.8.6/src/corelib/arch/qatomic_armv5.h
inline char q_atomic_swp(volatile char *ptr, char newval)
{
register char ret;
/*asm volatile("swpb %0,%2,[%3]"
: "=&r"(ret), "=m" (*ptr)
: "r"(newval), "r"(ptr)
: "cc", "memory");*/
ret=*ptr;
*ptr=newval;
return ret;
}
如果出现如下错误:
In file included from ssl/qsslsocket_openssl_symbols_p.h:57:0, from ssl/qsslcertificate.cpp:110:
ssl/qsslsocket_openssl_p.h:66:26: 致命错误: openssl/asn1.h:没有那个文件或目录编译中断。
make[1]: *** [.obj/release-shared-emb-arm/qsslcertificate.o] 错误 1
make[1]:正在离开目录 `/home/duliqun/qt-everywhere-opensource-src-4.8.6/src/network'
make: *** [sub-network-make_default] 错误 2
请执行:
sudo apt-get install openssl
sudo apt-get install libssl-dev
3.make install 编译安装成功。
在:/usr/local目录下就能看见安装好的QT库目录!
移植到开发板
将编译的文件夹,PC中的/usr/local/Trolltech/Qt-4.8.6/,拷到开发板的/usr/local/目录下,我是用SD卡拷的。
程序中显示中文字体等设置可以参见 Qt中显示中文 这篇博客。
(http://www.cnblogs.com/emouse/archive/2013/05/03/3056431.html)
设置环境变量:
我直接修改profile文件
#vi /etc/profile
在最后加入以下内容
export set QTDIR=/usr/local/Qt-4.8.6 #目录名要与拷贝的Qt文件夹名一致
export set LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
export set PATH=$QTDIR/bin:$PATH
export set MANPATH=$QTDIR/man:$MANPATH
export set QT_QWS_FONTDIR=/usr/local/Qt-4.8.6/lib/fonts
export set QWS_MOUSE_PROTO=tslib:/dev/event3 #重要
立即使用变量
#source /etc/profile
到此为止,QT的移植算是成功了
可以用Qt自带的示例程序来测试一下,
# cd /usr/local/Qt-4.8.6/demos/
此文件夹下有很多示例程序,随便选一个运行。
例如
cd affine/
./affine -qws
必须要加参数-qws