荔枝派nano(f1c100s)手动移植QT4.8.7
硬件环境:
1、荔枝派nano(f1c100s)
文章目录
一、概念理清 (必看)
请先看这!
请先看这!
请先看这!
1、关于f1c100s的交叉编译工具链,我用的是这个arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2,以下称为arm-none-linux-gnueabi;
wget https://sourcery.mentor.com/GNUToolchain/package12813/public/arm-none-linux-gnueabi/arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
好,为什么是这个呢,回答是我也不知道。目前我只有用这个编译出的应用程序放到单板上才能运行;
2、为什么Qt版本是Qt4.8.7,而不是Qt5.9或者别的?首先要明确一点,后面使用buildroot构建根文件系统和编译Qt应用程序使用的都是同一个工具链,也就是上面介绍的那个;然而arm-none-linux-gnueabi的gcc版本是4.8.3,接着你要了解所移植的QT版本对gcc版本的要求;然而Qt5.9对gcc的版本要求是大于4.8,所以结论:对于使用此工具链的f1c100s来说,Qt4.8.7和Qt5.9都是可以的;我选择Qt4.8.7是因为找不到Qt5.9;
3、小结:因为使用什么Soc而决定使用什么交叉编译工具链而移植什么版本的Qt;对于这个f1c100s来说,我是这么考虑的;所以本次f1c100s移植qt的方案就是:buildroot使用外置工具链,不会在buildroot下勾选Qt包,而是手动移植; 反正就是工具链gcc版本和Qt版本之间的关系,自己理清之后,随意搭配应该都可以的;没有固定的选择;
4、插播:怎么配置工具链,步骤如下:
# 下载工具链
wget https://sourcery.mentor.com/GNUToolchain/package12813/public/arm-none-linux-gnueabi/arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
# 解压工具链
tar -xvf arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
# 执行下面三条指令就可以在任何地方用了,但不是永久的
# 第三条换成你的路径
export ARCH=arm
export CROSS_COMPILE=arm-none-linux-gnueabi-
export PATH=$PATH:/home/book/licheePi-f1c100s/arm-2014.05/bin
# 测试
arm-none-linux-gnueabi-gcc -v
二、使用buildroot构建根文件系统
进入buildroot目录下:
#先执行一次 make distclean
make distclean
#随后执行 make menuconfig 进入图形化配置界面
make menuconfig
主要在于工具链部分的配置。本次buildroot使用外部已有的工具链,也就是上面介绍的工具链;
1、Target options
如图配置;
2、ToolChain
注意,Toolchain path的写法:正常的工具链路径是细节到/bin目录下的,也就是/home/book/licheePi-f1c100s/arm-2014.05/bin,但这里要把“/bin”去掉;
注意,Toolchain prefix的写法:这个工具链的前缀是arm-none-linux-gnueabi;$(ARCH) = arm,所以在后面加上 -none-linux-gnueabi 就行,不要再在结尾加个“-”了;
注意,gcc version的查看方法:就像上面那样: arm-none-linux-gnueabi-gcc -v;
注意,kernel header series的查看方法:在工具链目录里查看,
vi /home/book/licheePi-f1c100s/arm-2014.05/arm-none-linux-gnueabi/libc/usr/include/linux/version.h
3、System configuration
如图配置;
用户名、密码、欢迎语这些自定义;
4、编译(make)
编译结束后,根文件系统在buildroot根目录下的 output/images/ 下;
三、开始移植Qt4.8.7
源码的安装一般由3个步骤组成:配置(configure)、编译(make)、安装(make install)
1、下载源码并解压
# 下载源码
wget https://download.qt.io/archive/qt/4.8/4.8.7/qt-everywhere-opensource-src-4.8.7.tar.gz
# 解压源码
tar -xvf qt-everywhere-opensource-src-4.8.7.tar.gz
2、修改qmake.conf
# 进入Qt源码根目录修改 qmake.conf
vi mkspecs/linux-arm-gnueabi-g++/qmake.conf
就是修改为自己的工具链前缀
3、配置(configure)
在源码根目录下执行
./configure -release -xplatform linux-arm-gnueabi-g++ -prefix /opt/qt4.8.7_armlib -opensource -confirm-license -qt-sql-sqlite -qt-gfx-linuxfb -plugin-sql-sqlit -no-qt3support -no-phonon -no-svg -no-webkit -no-javascript-jit -no-script -no-scripttools -no-declarative -no-declarative-debug -qt-zlib -no-gif -qt-libtiff -qt-libpng -no-libmng -qt-libjpeg -no-rpath -no-pch -no-3dnow -no-avx -no-neon -no-openssl -no-nis -no-cups -no-dbus -embedded arm -platform linux-g++ -little-endian -qt-freetype -no-opengl -no-glib -nomake demos -nomake examples -nomake docs
-release:编译Qt的release版本;
-xplatform:后面的linux-arm-gnueabi-g++是路径,所以这是在指向交叉编译工具链的配置目录,后面编译Qt源码时所用的工具链它会去mkspecs/linux-arm-gnueabi-g++/下读取配置文件,也就是刚刚修改的那个qmake.conf;【个人理解】
-platform: 这里没加因为默认是linux-g++,这个不要和上面那个混淆了,这个是编译qmake用的,因为需要使用qmake来生成Qt的工程和Makefile,其实就是指定你交叉编译的平台主机,简单说明就是你写程序和编译程序的平台;【引用他人原话】
-prefix:指定安装目录;
-opensource:编译Qt的开源版本;
4、编译(make)
在源码根目录下执行
make -jx # x取决于你的cpu
5、安装(make install)
在源码根目录下执行
make install
安装结束后,可以到指定安装目录下查看,后面需要把qt4.8.7_armlib整个文件夹拷贝的单板下的/opt/目录下;
插播:编译Qt应用程序的流程是:把整个程序拷贝到虚拟机,使用Qt安装目录下的qmake生成Makefile,再执行make编译程序;
然而qmake就在Qt安装目录的bin目录下;
#qmake 生成 Makefile 示例
/opt/qt4.8.7_armlib/bin/qmake xxx.pro
6、拷贝qt4.8.7_armlib到单板
我使用的是sd卡启动,因为荔枝派nano的flash不足以放下目前大小的根文件系统;
所以把根文件系统拷贝到SD卡第二分区时,顺带把/opt/qt4.8.7_armlib拷贝到新根文件系统的/opt/目录下;
关于如何sd卡启动请参考这篇文章;
四、开始测试
1、随便整个简单的Qt程序到虚拟机下,我的是这个:
2、在工程目录下执行qmake
# Qt安装目录下的qmake
/opt/qt4.8.7_armlib/bin/qmake xxx.pro
3、make编译程序
# 会看到qmake后多了个Makefile
# 直接make
make
4、把工程拷贝到单板,并执行,执行时加上-qws
运行成功!
五、报错
当然,我并不是一次成功;
报错1
QLock::QLock: Cannot create semaphore /tmp/qtembedded-0/QtEmbedded-0 'd' (38, Function not implemented)
Cannot get display lock
如果出现类似的报错,请重新编译Linux内核并替换,内核需要勾选:
General setup > System V IPC
报错2
./xxx: not found
出现这种错误,大概率是编译buildroot和编译Qt应用程序所使用的工具链不一样;我最开始的错误就是这个,弄了很久;如果你不是按照这篇文章来的,那你可以尝试编译buildroot时选择使用外置的交叉编译工具链,同时指定编译Qt源码的工具链也是同一个,最后编译Qt应用程序也是同一个工具链;而不要buildroot使用内置工具链,再用buildroot的内置工具链编译Qt源码和去编译Qt应用程序;这是针对f1c100s;
报错3
error while loading shared libraries: libQtGui.so.4: cannot open shared object file: No such file or directory
把 /opt/qt4.8.7_armlib/lib/ 下的所有文件拷贝到 /usr/lib/
六、总结
以上有个人理解,若出现名词解释模糊或概念解释错误,请给予纠正!也请提出问题一起讨论!
此处列出主要参考文章:
1、f1c100S(licheepi_nano)的linux上运行QT搭建过程
2、全志F1C100s使用记录:u-boot & linux & rootfs 编译与烧录测试(基于SD卡)
3、嵌入式V3s交叉编译 tslib和QT4.8.7,并使用Qt Creator编译项目