【CubieTruck】交叉编译QT5.5.1

    xiaoxiao2021-04-16  39

    本篇主要讲述基于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 -o helloc sudo /opt/arm/bin/arm-linux-gnueabihf-g++ HelloWorld.cpp hellocpp

    然后将2个产生的a.out改名为ac.outacpp.out,拷贝到开发板上执行,查看是否能执行,若是能够输出gccrunning、g++running就证明交叉编译器可用,不行就更换交叉编译器 

    3.安装expat

    (1). 解压tar-zxvf expat-2.1.0.tar.gz

    (2). 配置

    cd命令进入文件夹,输入:

    sudo CC=/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命令进入文件夹,输入:

    sudo CC=/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 文件,

    sudo gedit 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.执行make install

    最终在/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 mkdir lib 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 mv explant_qt.tar.gz ~/ rm -r lib

     

    打包后的文件就在当前用户目录下。将其复制到优盘,拷贝到开发板,使用命令:

    #sudo fdisk -l可查看U盘是哪一个 sudo mount /dev/sd* /media cd /media sudocp explant_qt.tar.gz /opt cd /opt sudo tar –xzvf explant_qt.tar.gz sudo mv lib/* /lib

    这样文件就全部拷贝到开发板了

     

    2.配置开发板环境变量

    vim/etc/profile打开开发板的/etc目录下的profile文件(没有vim用vi也行),在后面添加:

    PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin:/opt/qt-5.5.1/bin export PATH #set hostname HOSTNAME='/bin/hostname' export HOSTNAME #Set PS1 PS1='[\u@\h\W]\$' export PS1 #qtpath export QTDIR=/opt/qt-5.5.1 export LD_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 export QT_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,看到的就是全屏 

     

    参考链接:http://blog.csdn.net/u014695839/article/details/50805102

     

    转载请注明原文地址: https://ju.6miu.com/read-673195.html

    最新回复(0)