(一) 移植 qt5.6.3
一、qt简介:
Qt是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏,Qt很容易扩展,并且允许真正地组件编程。
2008年,Qt Company科技被诺基亚公司收购,Qt也因此成为诺基亚旗下的编程语言工具。2012年,Qt被Digia收购。2014年4月,跨平台集成开发环境Qt Creator 3.1.0正式发布,实现了对于iOS的完全支持,新增WinRT、Beautifier等插件,废弃了无Python接口的GDB调试支持,集成了基于Clang的C/C++代码模块,并对Android支持做出了调整,至此实现了全面支持iOS、Android、WP,它提供给应用程序开发者建立艺术级的图形用户界面所需的所有功能。基本上,Qt 同 X Window 上的 Motif,Openwin,GTK 等图形界 面库和 Windows 平台上的 MFC,OWL,VCL,ATL 是同类型的东西。
二、编译:
(1)下载对应QT安装包及源码:
http://download.qt-project.org/archive/
(2)编译环境配置:
apt-get install lib32ncurses5 lib32z1
apt-get install gcc-multilib g++-multilib
环境变量添加:/usr/lib/gcc/x86_64-linux-gnu/4.8/
PS:各编译器版本的差异:
1、arm-none-linux-gnueabi (ARM architecture, no vendor, linux OS, and the gnueabi ABI)
用于编译ARM架构的u-boot、linux内核、linux应用等
2、arm-none-eabi
用于编译ARM架构的裸机系统(包括linux的 boot、kernel)
3、arm-eabi
Android ARM 编译器
(3)配置&编译:
1.修改 qt-everywhere-opensource-src-5.6.3/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf 指定编译器如下 (根据自己环境配置):
# modifications to g++.conf QMAKE_CC = arm-linux-gcc QMAKE_CXX = arm-linux-g++ QMAKE_LINK = arm-linux-g++ QMAKE_LINK_SHLIB = arm-linux-g++ # modifications to linux.conf QMAKE_AR = arm-linux-ar cqs QMAKE_OBJCOPY = arm-linux-objcopy QMAKE_NM = arm-linux-nm -P QMAKE_STRIP = arm-linux-strip load(qt_config)
针对2440增加如下:
QT_QPA_DEFAULT_PLATFORM = linuxfb QMAKE_CFLAGS += -ldl -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv4t -mtune=arm920t QMAKE_CXXFLAGS += -ldl -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv4t -mtune=arm920t
# march 指的 cpu 架构,针对 2440 来说是 armv4t 、 mtune 指的 cpu 名字,针对 2440 来说是 arm920t
2.增加一个编译配置脚本 build.sh,内容如下:
./configure
-verbose
-prefix $(pwd)/out/QtEmbedded-arm
-opensource
-release
-confirm-license
-xplatform linux-arm-gnueabi-g++
-shared
-qt-zlib
-no-gif
-qt-libjpeg
-no-opengl
-no-cups
-no-glib
-no-dbus
-no-rpath
-no-sse2 -no-sse3 -no-ssse3 -no-sse4.1 -no-sse4.2
-no-avx
-no-openssl
-nomake tools
-qreal float
-qt-libpng
-tslib
-ldl
-nomake examples
-I/home/sheldon/workspace/tslib/out/tslib/include -L/home/sheldon/workspace/tslib/out/tslib/lib #这里可参考 (二) 移植 tslib 部分编译好tslib库
3.编译打包QT移植到arm开发板:
./build.sh && make && make install
以上三个步骤没问题的话,在out/QtEmbedded-arm 目录下生成编译输出文件,拷贝需要的文件到开发板新建的Qt5.6目录(lib和plugins)。
4.设置QT环境变量:
文件系统 /etc/profile 里添加:
export QTEDIR=/usr/local/Qt5.6
export LD_LIBRARY_PATH=/usr/local/Qt5.6/lib:$LD_LIBRARY_PATH
export QT_QPA_GENERIC_PLUGINS=tslib
export QT_QPA_FONTDIR=$QTEDIR/lib/fonts
export QT_QPA_PLATFORM_PLUGIN_PATH=$QTEDIR/plugins
export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size=480x272:mmSize=480x272:offset=0x0:tty=/dev/tty1
export QT_QPA_FB_TSLIB=1
红色部分请根据自己的开发板进行修改,JZ2440 V3开发板是 4.3 寸 480*272 的 LCD。
5.测试QT库:
(1)修改ubuntu主机默认qmake路径:
vi /usr/lib/x86_64-linux-gnu/qt-default/qtchooser/default.conf
修改第一行为本机qt源码交叉编译路径: /home/sheldon/workSpace/jz2440/qt-everywhere-opensource-src-5.6.3/out/QtEmbedded-arm/bin (qmake arm版本)
(2)编译测试源码 hello.cpp:
#include <QApplication> #include <QLabel> int main(int argc, char **argv) { QApplication app(argc, argv); QLabel *label = new QLabel; label->setText("hello to World!"); label->show(); return app.exec(); }
顺序执行以下操作: (qmake是qt源码编译生成的arm版本)
1. 执行:qmake -project hello.cpp -o ./hello.pro 生成 hello.pro 工程文件;
qmake hello.pro ,然后提示如下警告
WARNING: Failure to find: /qt_test.cpp ,修改hello.pro:
(1)删除: hello.cpp
(2)增加:greaterThan(QT_MAJOR_VERSION, 4): QT += widgets #qt5模块有变化
如下:
2. 执行:qmake hello.pro 生成 Makefile 文件 (可以打开查看一下)
3. 执行:make 生成 hello.o 及 hello可执行文件,拷贝到arm开发板运行即可看到 hello to World! 显示;
异常:
执行 ./hello 报错: /lib/libc.so.6: version `GLIBC_2.9' not found (required by /usr/local/Qt5.6/lib/libQt5Core.so.5)
/mnt/qt_project # strings /lib/libc.so.6 | grep GLIBC_ (指令查看支持的版本只支持到2.8)
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_PRIVATE
更新内核版本
或
更新glibc库:(申明:如果更新的so不能用会导致系统瘫痪,请君三思而为!!!)
(1)glibc源码下载: http://ftp.gnu.org/gnu/glibc/
源码包:glibc-2.14.tar.gz
补丁包:glibc-ports-2.14.tar
(2)解压后将补丁glibc-ports-2.14 拷贝到 glibc-2.14目录中并命名为 ports,单独建立目录及配置脚本:
mv glibc-ports-2.14 glibc-2.14/ports
mkdir glibc-2.14
cd glibc-2.4
vi build.sh ,内容如下:
CC=arm-linux-gcc CXX=arm-linux-g++ AR=arm-linux-ar RANLIB=arm-linux-ranlib
../configure
--prefix=/home/sheldon/workspace/mount/glibc-2.14/out
--host=arm-linux
--build=x86_64-linux-gnu
--enable-add-on
libc_cv_forced_unwind=yes
libc_cv_c_cleanup=yes
libc_cv_gnu99_inline=yes
然后更新so:
cp ./ld-linux.so.3 /lib/
cp ./libc.so.6 /lib/libc.so.6
(二) 移植 tslib
一、tslib简介:
./autogen.sh
make install
export TSLIB_CALIBFILE=/etc/pointercal #指定触摸屏校准文件 pintercal 的存放位置
export TSLIB_CONFFILE=/usr/local/tslib/etc/ts.conf #指定 TSLIB 配置文件的位置
export TSLIB_PLUGINDIR=/usr/local/tslib/lib/ts #指定触摸屏插件所在路径
export TSLIB_CONSOLEDEVICE=none #设定控制台设备为 none ,否则默认为 /dev/tty
export TSLIB_FBDEVICE=/dev/fb0 #指定帧缓冲设备(lcd)
6.以上步骤已经完成tslib移植,可以通过 /usr/local/tslib/bin 目录下的可执行文件进行测试:
./ts_calibrate (触摸屏矫正)
./ts_test (触摸屏测试)
/home/sheldon/workSpace/tool/arm-linux-4.4.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.3/../../../../arm-none-linux-gnueabi/bin/ld: warning: libm.so.6, needed by /home/sheldon/workSpace/tool/arm-linux-4.4.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.3/../../../../arm-none-linux-gnueabi/lib/libstdc++.so, not found (try using -rpath or -rpath-link) /home/sheldon/workSpace/tool/arm-linux-4.4.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.3/../../../../arm-none-linux-gnueabi/lib/libstdc++.so: undefined reference to `asin@GLIBC_2.4' /home/sheldon/workSpace/tool/arm-linux-4.4.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.3/../../../../arm-none-linux-gnueabi/lib/libstdc++.so: undefined reference to `log@GLIBC_2.4' /home/sheldon/workSpace/tool/arm-linux-4.4.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.3/../../../../arm-none-linux-gnueabi/lib/libstdc++.so: undefined reference to `fmod@GLIBC_2.4' /home/sheldon/workSpace/tool/arm-linux-4.4.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.3/../../../../arm-none-linux-gnueabi/lib/libstdc++.so: undefined reference to `sin@GLIBC_2.4' /home/sheldon/workSpace/tool/arm-linux-4.4.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.3/../../../../arm-none-linux-gnueabi/lib/libstdc++.so: undefined reference to `tanh@GLIBC_2.4'
从较新的交叉编译工具中拷贝该库过来,并重新建立链接:
sudo cp ../arm-linux-gcc-4.5.1/arm-none-linux-gnueabi/lib/libstdc++.so.6.0.14 ../arm-linux-4.4.3/arm-none-linux-gnueabi/lib/
ln -s ../arm-linux-4.4.3/arm-none-linux-gnueabi/lib/libstdc++.so.6.0.14 ../arm-linux-4.4.3/arm-none-linux-gnueabi/lib/libstdc++.so
ln -s ../arm-linux-4.4.3/arm-none-linux-gnueabi/lib/libstdc++.so.6.0.14 ../arm-linux-4.4.3/arm-none-linux-gnueabi/lib/libstdc++.so.6
用 arm-linux-gcc-4.5.1 可以编译通过,对比 arm-linux-gcc-4.4.3 目录发现lib放错位置,修正如下:
配置好的 arm-linux-gcc-4.4.3 交叉编译工具已上传到百度云 ---> 链接: https://pan.baidu.com/s/1DoS7Kkb-k3mxXAt5ZAL6fQ 提取码:rmr1
问题3:
运行tslib测试程序时提示 “selected device is not a touchscreen I understand” :
参考网上的解决方案是需要将内核代码和交叉编译工具的 EV_VERSION 宏定义要一致: