- 开发板有uboot
- 搭建tftp服务器,开发板可以通过服务器下载核心并启动;
- nfs工具,开发板可通过nfs将工具加载到主机电脑)rootfs;
- 可使用触摸屏,在cat当有触摸动作时,触摸屏设备可以获得反馈信息。
- 查看输入设备:ls /dev/input/event1
- 测试输入设备:cat /dev/input/event1
Tslib它是一个开源程序,可以为触摸屏驱动的采样提供滤波、抖动、校准等功能。tslib本来是用来校正电阻触摸屏的工具,虽然电容屏不需要校正,但是qt因此,即使是电容触摸屏,我们也必须移植它tslib。
- 下载tslib-1.4(网上比较多,这里不提供下载链接);
- 解压tslib源码 tar -xvf tslib-1.4.tar.gz
- 环境检测:进入解压目录 ./autogen.sh
报错: ./autogen.sh: 4: ./autogen.sh: autoreconf: not found 因为这个工具需要三个软件autoconf、automake 、libtool而ubuntu默认情况下,需要安装计算机联网,输入sudo apt-get install autoconf automake libtool安装工具;
- 输入指令echo "ac_cv_func_malloc_0_nonnull=yes">arm-linux.cache
- 创建一个目录tslib安装目录: mkdir /opt/tslib
- 生成makefile并指定了安装路径、安装工具等配置: ./configure --prefix=/opt/tslib --host=arm-linux --cache-file=arm-linux.cache
- 编译:make
- 安装:make install
事实上,我们刚刚设置了交叉编译工具链,其结果是开发板。现在只需要直接复制到开发板上。
- 将安装在opt目录下的tslib(动态库.so 、配置文件、bin文件)全部复制到开发板;
- 定义tslib运行所需的环境变量
export TSLIB_TSDEVICE=/dev/input/event1 ///导出触摸设备的路径
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 //
这些环境变量可以手动逐个添加,但太麻烦了,应该添加到/etc/profile启动时自动执行;
运行 ./ts_calibrate测试校正程序。
报错:No raw modules loaded. ts_config: No such file or directory
解决:在tslib目录下的etc/ts.conf文件中的module_raw input打开(删除#),注意前面没有空间。
报错:tslib移植-selected device is not a touchscreen I understand 错误解决
解决:原因是tslib输入系统和核心input如果系统版本不匹配,arm头文件库中的交叉编译工具linux/input.h中的EV_VERSION 宏改为0x010001
vi /usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/usr/include/linux/input.h
将define EV_VERSION 0x010000改为define EV_VERSION 0x010001
重新编译tslib库可以重新部署。
下载qt5.6.并解压2源码包,( 课程中提到了文件名qt-everywhere-opensource-src-5.6.2.tar.gz)在/opt在目录下创建一个qt5.6.2文件夹,用来做qt安装目录。
配置qmake:修改qtbase/mkspecs/linux-arm-gnueabi-g /qmake.conf文件;
添加下内容:
#hdz added
QT_QPA_DEFAULT_PLATFORM = linuxfb
QMAKE_CFLAGS_RELEASE += -O2 -march=armv7-a
QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv7-a
修改如下内容,工具链名称一定要与本机安装的名称相同
# 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的提示来配置
黄色部分需要自己修改,/opt/QT5.6.2指的是安装的路径,-I和-L是指定的tslib的路径,这个也要与前面部署tslib的路径相同。\为换行接续符,注意\后面不能有空格。
./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
编译make
错误1:找不到dlopen或者dlsym
解决:在编译器后面加ldl arm-linux-g++ -ldl
错误2:undefined reference to `__sync_add_and_fetch_4'
解决:
参考qt5.3.2移植到arm上出undefined reference to '__sync_sub_and_fetch_4的错
apt-get install libtool(通常在安装tslib时已安装);
创建一个文件夹mkdir /home/hudaizhou/sound_code/QT5.8.0/linux-atomic
将课程共享的linux-atomic.c拷贝到该目录。
执行以下2条命令,利用libtool生成liblinux-atomic.a(注意生成的目录名叫.libs所以是隐藏的):
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
拷贝生成的.libs/ liblinux-atomic.a到/opt/linux-automic
cp .libs/liblinux-atomic.a /opt/linux-automic // 注意/opt/linux-automic是自己事先创建的
在QT源码下修改:./qtscript/src/script/Makefile
在LIBS = 的结尾添加 -L/opt/linux-automic -llinux-atomic
编译安装:make install
完成后就可以在/opt/qt5.6.2目录下看到安装的内容。
截止目前我们arm平台的qt就安装完成了,安装的文件我们电脑端交叉编译的时候需要用到,开发板中也需要用到,所以在部署的时候需要对该目录下的文件进行拷贝。
qtcreator是一个电脑端的qt应用开发IDE,用于我们在电脑端开发和调试应用。
- 下载qt-opensource-linux-x64-5.6.2.run(qt课程工具中包含有)
- 直接安装即可。安装完成后,qtcreator在~/Qt5.6.2/Tools/QtCreator/bin目录下;
我们写的应用程序通常需要在电脑的ubun运行,方便调试,待调试完成后,放在开发板上运行,我们知道电脑是x86平台,而开发板是arm平台,两平台运行的程序不同,因此我们需要分别编译,在电脑调试时使用MinGW编译成x86平台运行的可执行文件,而要在开发板运行则需要使用gcc编译成arm平台运行的可执行文件。
工具-选项-构建和运行,必须先添加编译器、qt versions、构建套件。因此我们需要在电脑qtcreator中安装2套编译器。MinGW在安装qtcreator时已经安装了,我们只需补充安装gcc相关工具即可。
设定交叉编译工具链
交叉编译工具链,实际就是arm平台的编译工具gcc,他负责把代码编译链接成arm平台下的可执行文件,指定电脑中交叉编译工具链目录,例如我的电脑安装目录/usr/local/arm/arm-2009q3/bin/arm-linux-gcc。名称可任意设置,如arm-linux-gcc,其余的可以不填。
选择qt versions
qt versions译做qt版本,这个名词不太贴切,他其实是一系列的工具库,最关键的库就是qmake,qmake是一个项目管理工具,可以自动生成makefile。
添加/opt/qt5.6.2/bin/qmake即可。
选择qtkit
qtkit中文叫构件套件,他包含了套件名称、文件系统名称、设备类型、设备、sysroot、C/C++ 编译器、调试器、Qt 版本等信息。他把编译器和调试器进行组合,常见的组合如:MinGW 编译器 + GDB 调试器、GCC 编译器 + GDB 调试器(Ubuntu)。设置如下。
前面已经实现了把源码交叉编译成了arm平台下的可执行程序,按理说我们交叉编译的程序就可以在开发板运行,但实际还是不行,因为qt应用程序运行时要依赖很多的库,要想能正常运行就必须把电脑qtcreator在进行交叉编译代码时依赖的arm平台库等一系列的文件也拷贝到开发板中。
在开发板文件系统(~/sound_code/rootfs/rootfs)中创建一个文件夹用来放库: mkdir QT5.6.2
将我们在电脑端部署的arm平台qt中的库拷贝到创建的目录中:
cp /opt/qt5.6.2/lib/ ./ -rf
cp /opt/qt5.6.2/plugins/ ./ -rf
qt库拷贝过去后,开发板系统并不能找到,需要我们把路径添加到环境变量,实际上qt运行时需要设置多个环境变量,如下:
export LD_LIBRARY_PATH=/QT5.6.2/lib:$LD_LIBRARY_PATH //导出lib路径
export QT_QPA_PLATFORM_PLUGIN_PATH=/QT5.6.2/plugins //导出plugins路径
export QT_QPA_FONTDIR=/QT5.6.2/lib/fonts //导出fonts路径
export QT_QPA_FB_TSLIB=1 //使用tslib作为输入
export QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/event1 //指定输入设备,一定要与tslib设定的一样。
export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size=1024x600:mmSize=1024x600:offset=0x0:tty=/dev/tty1
size就是显示屏分辨率,mmSize是显存大小,
为了每次开机能自动去导入环境变量,应该和tslib的环境变量导出一样操作,放在/etc/profile中。
报错:error while loading shared libraries: libstdc++.so.6
解决:提示找不到c++库,是因为我们没拷贝c++的库,在交叉编译工具链中,路径:/usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/usr/lib。拷贝到开发板/QT5.6.2/lib。
报错:using Latin-1 for conversion, iconv_open failed
解决:缺少一个运行时库preloadable_libiconv.so,交叉编译得到这个后放进去/lib目录下即可。
参考:http://blog.csdn.net/wangyuanfei555/article/details/47399771
移植libiconv中遇到的问题及解决:
报错: ./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");
解决:找到那一行,注释掉。另外编译好的库是intel80386架构的,不是ARM的,不能用,要交叉编译才行。
解决:先看配置好的Makefile,找交叉编译工具链的全局变量。但是本项目的Makefile中没有CC等这些定义,像这种一般就是通过环境变量来设置的。交叉编译libiconv,参考:http://blog.csdn.net/wuyu92877/article/details/52472810编译libiconv错误提示gets相关的,参考:http://blog.csdn.net/ownfire/article/details/47276219
./configure -prefix=$PWD/_install --host=arm-none-linux-gnueabi
make CROSS_COMPILE=arm-linux-none-gnueabi- ARCH=arm
export LD_PRELOAD=/lib/preloa