红联Linux门户
Linux帮助

CubieTruck交叉编译QT 5.5.1

发布时间:2016-10-11 12:02:18来源:linux网站作者:BEATFAN
本篇主要讲述基于frame buffer的qt交叉编译,可直接用于服务器版本linux(无Desktop),大大降低了空间使用率和资源使用率。参考自网上许多文章,大多不记得链接了,主要参考在文章末尾注明,有兴趣的可点击查看。
 
一、环境说明
-PC系统:ubuntu14.04 LTS x86
- 编译器:gcc-linaro-arm-linux-gnueabihf4.9
(arm-linux-gneabihf-gcc 与  arm-none-linux-gnueabi-gcc 的不同,使用arm-linux-gnueabihf-gcc编译的程序,后面在开发板上执行时会出现nosuch file or directory)
- 开发平台:CubieTruck
- 开发板系统:debian-server-ct-nand-v1.0.img
 
二、下载源码
QT源码官网下载:http://download.qt.io/official_releases/qt/5.5/5.5.1/single/
交叉编译器下载:http://download.csdn.net/detail/sway913/9316421
expat源码下载: http://sourceforge.net/projects/expat/files/expat/
dbus源码的下载:http://dbus.freedesktop.org/releases/dbus/
expat-2.1.0和dbus-1.2.30
 
三、准备工作
1. 配置交叉编译器
(1). 解压gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux.tar.xz
对于解压后的文件夹,我将其改名为arm,然后使用命令mvarm/ /opt/将其移动到opt/目录下面。环境变量可要可不要,编译中发现有时环境变量不起作用,索性使用绝对地址。
(2). 测试交叉编译器:
一定要先行测试,编译一次几个小时都算少的,我就做了很多无用功,花费一个星期才成功。
建两个目录arm_gcc、arm_g++,在两个文件夹中分别新建HelloWorld.c、HelloWorld.cpp
//HelloWorld.c
#include"stdio.h"
intmain()
{
printf("gcc running!\n");
return0;
}
//HelloWorld.cpp
#include "iostream"
usingnamespace std;
intmain()
{
cout<<"g++ running!"<<endl;
return0;
}
然后到两个文件夹下分别编译
sudo/opt/arm/bin/arm-linux-gnueabihf-gcc HelloWorld.c
sudo/opt/arm/bin/arm-linux-gnueabihf-g++ HelloWorld.cpp
然后将2个产生的a.out改名为ac.outacpp.out,拷贝到开发板上执行,查看是否能执行,若是能够输出gccrunning、g++running就证明交叉编译器可用,不行就更换交叉编译器 
3.安装expat
(1).解压tar-zxvf expat-2.1.0.tar.gz
(2).配置
cd命令进入文件夹,输入:sudoCC=/opt/arm/bin/arm-linux-gnueabihf-gcc ./configure--host=arm-linux --prefix=/opt/expat-2.1.0
其中prefix参数设置的是最后makeinstall的安装路径,在这里即/opt/expat-2.1.0
假如出现错误,可能是没有把绝对路径写对(不要使用环境变量,中间会识别不到)
(3).成功后执行make
(4).执行makeinstall
4.安装dubs
(1).解压
tar-zxvf dbus-1.2.30.tar.gz
(2).配置
cd命令进入文件夹,输入:sudoCC=/opt/arm/bin/arm-linux-gnueabihf-gcc ./configureCFLAGS=-I/opt/expat-2.1.0/include LDFLAGS=-L/opt/expat-2.1.0/lib--prefix=/opt/dbus-1.2.30 --host=arm-linux--enable-abstract-sockets
(3).执行make
(4).执行makeinstall
(5)生成machine-id
执行命令dbus-uuidgen>/opt/EmbedRigol/install-dev/dbus-1.2.30/var/lib/dbus/machine-id
如果没有相应目录请按照错误提示将路径建立完整。
 
四、交叉编译QT
1.解压下载的源码tar-zxvf qt-everywhere-opensource-src-5.5.1.tar.gz
2.修改qmake.cof
进入qtbase/mkspecs/linux-arm-gnueabi-g++/ 目录,并打开 qmake.conf 文件,
sudogedit qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf
修改成如下:
#
#qmake configuration for building witharm-linux-gnueabi-g++
#
MAKEFILE_GENERATOR      =UNIX
CONFIG                 +=incremental
QMAKE_INCREMENTAL_STYLE = sublib
QT_QPA_DEFAULT_PLATFORM = linuxfb
QMAKE_CFLAGS_RELEASE   +=-O2 -march=armv7-a
QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv7-a
QMAKE_INCDIR           +=/opt/dbus-1.2.30/include/dbus-1.0
QMAKE_INCDIR           +=/opt/dbus-1.2.30/lib/dbus-1.0/include
QMAKE_LIBDIR            +=/opt/dbus-1.2.30/lib
include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
#modifications to g++.conf
QMAKE_CC               = /opt/arm/bin/arm-linux-gnueabihf-gcc
QMAKE_CXX              = /opt/arm/bin/arm-linux-gnueabihf-g++
QMAKE_LINK             = /opt/arm/bin/arm-linux-gnueabihf-g++
QMAKE_LINK_SHLIB       = /opt/arm/bin/arm-linux-gnueabihf-g++
#modifications to linux.conf
QMAKE_AR               = /opt/arm/bin/arm-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY          = /opt/arm/bin/arm-linux-gnueabihf-objcopy
QMAKE_NM               = /opt/arm/bin/arm-linux-gnueabihf-nm -P
QMAKE_STRIP            = /opt/arm/bin/arm-linux-gnueabihf-strip
load(qt_config)
3.修改解压目录下的qt.pro文件
sudogedit qt.pro
在文件中找到两行(嵌入式不支持3D,除非有opengl):
addModule(qt3d,qtdeclarative qtimageformats)
addModule(qtcanvas3d,qtdeclarative)
在前面添加#注释掉:
#addModule(qt3d,qtdeclarative qtimageformats)
#addModule(qtcanvas3d,qtdeclarative)
4.配置编译参数
输入:sudo ./configure -opensource –release -xplatformlinux-arm-gnueabi-g++ -prefix /opt/qt-5.5.1 -confirm-license-no-iconv -no-opengl  -dbus
(若release提示有错,删除即可)
-xplatform指定平台,也就是qmake 配置文件的文件夹名 linux-arm-gnueabi-g++
-prefix 后面跟编译后执行 makeinstall 的安装路径
-confirm-license 相当于同意一个协议
-no-opengl 为了不编译 3d 参数,这里增加 ”-no-opengl ” 参数
如果提示:
Buildparts ............ libs examples
Mode ...................release
Using sanitizer(s)......none
Using C++11 ............yes
Using gold linker.......no
Using new DTAGS ........yes
Using PCH ..............yes
Target compilersupports:
Neon................. no
……(此处省略中间部分)
SQL drivers:
DB2.................. no
InterBase............ no
MySQL................ no
OCI.................. no
ODBC................. no
PostgreSQL........... no
SQLite2 ............. no
SQLite............... yes (plugin,using bundled copy)
TDS.................. no
tslib ..................no
udev ...................no
xkbcommon-x11...........no
xkbcommon-evdev.........no
zlib ...................yes (bundledcopy)
则配置成功。
5.执行make
编译,等待大概2个小时
6.执行makeinstall
最终在/opt目录下会出现qt-5.5.1文件夹。
 
五、移植到开发板
1.打包拷贝
拷贝主要有3大类文件:qt、dbus、库文件
库文件有以下三类:
/opt/arm/arm-linux-gnueabihf/libc 目录所有 .so 文件
/opt/arm/arm-linux-gnueabihf-gcc/libc/usr/lib目录下的libstdc++.so.6和libstdc++.so.6.0.20
/opt/dbus-1.2.30/lib目录下的libdbus-1.so、libdbus-1.so.3、libdbus-1.so.3.4.3
以下是执行脚本,可保存成.sh,并赋予执行权限(chmod+x)在terminal执行
#!/bin/bash
cd/opt
mkdirlib
find/opt/arm/arm-linux-gnueabihf/libc/ -name "*.so" -exec cp {} lib\;
cp/opt/arm/arm-linux-gnueabihf/lib/libstdc++.so.6/opt/arm/arm-linux-gnueabihf/lib/libstdc++.so.6.0.20 lib
cp/opt/dbus-1.2.30/lib/libdbus-1.so/opt/dbus-1.2.30/lib/libdbus-1.so.3/opt/dbus-1.2.30/lib/libdbus-1.so.3.4.3 lib
tar-czvf explant_qt.tar.gz lib qt-5.5.1 dbus-1.2.30
mvexplant_qt.tar.gz ~/
rm -rlib
打包后的文件就在当前用户目录下。将其复制到优盘,拷贝到开发板,使用命令:
sudomount /dev/sd* /media   //sudo fdisk -l可查看U盘是哪一个
cd/media
sudocp explant_qt.tar.gz /opt
cd/opt
sudotar –xzvf explant_qt.tar.gz
sudomv lib/* /lib
这样文件就全部拷贝到开发板了
2.配置开发板环境变量
vim/etc/profile打开开发板的/etc目录下的profile文件(没有vim用vi也行),在后面添加:
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/opt/qt-5.5.1/bin
export PATH
#sethostname
HOSTNAME='/bin/hostname'
export HOSTNAME
#SetPS1
PS1='[\u@\h\W]\$'
export PS1
#qtpath
export QTDIR=/opt/qt-5.5.1
exportLD_LIBRARY_PATH=/lib:$QTDIR/lib:$LD_LIBRARY_PATH
export QT_QWS_FONTDIR=$QTDIR/lib/fonts
export QT_QPA_PLATFORM_PLUGIN_PATH=$QTDIR/plugins
export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0
exportQT_QPA_GENERIC_PLUGINS=evdevtouch:/dev/input/event1
export QML2_IMPORT_PATH=$QTDIR/qml
保存后执行命令source /etc/profile重启文件。
4.在开发板上执行一下QT自带的案例程序
进入/opt/qt-5.5.1/examples/下随便选一个执行程序(一定要使用sudo,不然不能调用系统的/dev/fb0显示gui)。程序能运行则移植成功。
由于之前qmake.conf中设定了QT_QPA_DEFAULT_PLATFORM=linuxfb,是基于framebuffer的,没有调用xlib,所以程序是没有标题栏的,窗体大小基于qt设置的窗体大小,跟屏幕分辨率也有关。不能使用xlib的全屏功能。
 
注意:
一、交叉编译器是关键。
选错了编译器,编译出来的qt当然是不能不能给这个开发板使用了,网上大多是gnueabi的,其他开发板也可参考此文档,但是一定要在开发板上查看适用的gcc版本。Debian中没有gcc,我是通过lubuntu-desktop版查出来cubietruck是arm-gnueabihf的,所以更换了编译器就正确移植了,前后折腾了一个多星期。
二、使用32位操作系统。毕竟armv7是32位的,虽然可以适用lib32适配,但是编译中还是有各种问题,反正我换了32位之后就很顺利。
三、一定要使用root权限(sudo)执行qt程序,不然会出错。
四、桌面版的启动程序后会有两个鼠标&键盘,桌面和qt程序抢占fb,这是交叉编译的问题,要么在命令行中启动,要么使用开发板编译。我选择的是命令行,可以不要桌面,减少资源,也可能防止用户看到程序以外的东西。
 
小技巧:
一、开机自登陆、程序自启动。
嵌入式开发的程序主要是给设备操作者交互,有时并不希望操作者有太多的权限或者动作。一般都希望开机自动登录,登录后自动启动程序。
首先自登陆
编辑/etc/inittab
找到以下这行
1:2345:respawn:/sbin/agetty38400 tty1 linux
替换为:
1:2345:respawn:/bin/login-f 用户名 tty1 《/dev/tty1》/dev/tty1 2>&1   #注意《》替换为< >,博客编辑有问题
或者
将1:2345:raspawn:/sbin/agetty34800 tty1 改为:
1:2345:raspawn:/sbin/agetty--autologin 用户名 34800 tty1(用/sbin/mingetty来启动终端,tty1表启动的终端号,并以root用户登录终端)
然后是自启动
这个自启动一定要在登录之后执行,用户文件夹下有两个启动脚本,一个叫.bashrc,另一个叫.profile,.bashrc是非交互脚本,.profile是交互脚本,用户登录之后才会执行,在其中编写需要启动的程序命令(例如sudo/home/cubie/test)
二、在ui上放一些按钮(退出、重启、关机),用于用户执行系统操作,否则程序无法退出,无法关机,只能强制关闭电源。QProcess::execute(“shellcommand”),提供能输入shell命令的借口
 
放几张成功移植的图片:
屏幕是1366*768的,ui也设置的1366*768,看到的就是全屏。
CubieTruck交叉编译QT 5.5.1
CubieTruck交叉编译QT 5.5.1
 
本文永久更新地址:http://www.linuxdiyf.com/linux/24936.html