ubuntu下移植编译arm架构的QT

利用QtCreator编译X86的Qt程序,直接点运行键就可编译运行程序,这是因为QtCreator帮我们配置了编译工具(qmake和gcc),但是要编译ARM版本的Qt程序,就需要移植ARM架构的QT库。

一、下载交叉编译工具链

下载arm -gcc的交叉编译工具链

二、下载触摸屏库tslib

1.切换到tslib目录:

  安装交叉编译tslib必须的一些工具(可以先查看是否已安装,ubuntu16.04自带这些工具,可跳过)
   sudo apt-get install autoconf
   sudo apt-get install automake
   sudo apt-get install libtool

2.利用脚本写编译过程
在tslib文件夹下新建文件configTslib14.sh

vi configTslib14.sh
内容如下:
#!/bin/sh
make clean && make distclean
echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache
CC=/usr/local/arm/arm-2014.05/bin/arm-none-linux-gnueabi-gcc ./configure --host=arm-linux --prefix=/opt/tslib1.4 --cache-file=arm-l  inux.cache
make && make install

3.运行configTslib14.sh

./configTslib14.sh
执行结束后,我们查看一下是否安装成功,执行命令:
ls /opt/tslib1.4
如果出现bin,etc,include,lib这4个目录,说明交叉编译并安装tslib成功。

三、移植QT到ARM

1、 要移植Qt必须要用到Qt的源码,在这里也是用Qt5的源码来移植。源码下载,选择文件qt-everywhere-opensource-src-xxx.tar.gz下载。
2、将下载好的qt-everywhere-opensource-src-xxx.tar.gz移动至/opt目录下
在/opt目录下解压:sudo tar -zxvf qt-everywhere-opensource-src-xxx.tar.gz
然后进入解压后目录:cd qt-everywhere-opensource-src-xxx

3、下面设置编译平台。编译器是通过xplatform参数指定的,xplatform后面跟的参数实际上就时qtbase/mkspec下的文件夹的名字,这里以linux-arm-gnueabi-g++为模板,拷贝这个文件夹,重命名为arm-linux,然后修改这个文件夹里的qmake.conf,修改后的内容如下:

# qmake configuration for building with arm-linux-gnueabi-g++

MAKEFILE_GENERATOR      = UNIX
CONFIG                 += incremental
QMAKE_INCREMENTAL_STYLE = sublib

QT_QPA_DEFAULT_PLATFORM = linux #eglfs
QMAKE_CFLAGS_RELEASE += -O2 -march=armv7-a     // 指定平台
QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv7-a

include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)

/*
以下是指定交叉编译工具链的具体路径(你也可以设置成环境变量,直接写
arm-linux-gcc,这样就可以不用加上绝对路径,我这里因为linux下有多种版 本的工具链,所以加上绝对路径,具体写法要看你的linux情况)
*/
#modifications to g++.conf   
QMAKE_CC                = /usr/local/arm/gcc-4.6.2-glibc-2.13-linaro-multilib-         2011.12/fsl-linaro-toolchain/bin/arm-fsl-linux-gnueabi-gcc
QMAKE_CXX               = /usr/local/arm/gcc-4.6.2-glibc-2.13-linaro-multilib-  2011.12/fsl-linaro-toolchain/bin/arm-fsl-linux-gnueabi-g++
QMAKE_LINK              = /usr/local/arm/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/arm-fsl-linux-gnueabi-g++
QMAKE_LINK_SHLIB        = /usr/local/arm/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/arm-fsl-linux-gnueabi-g++

# modifications to linux.conf
QMAKE_AR                = /usr/local/arm/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/arm-fsl-linux-gnueabi-ar cqs
QMAKE_OBJCOPY           = /usr/local/arm/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/arm-fsl-linux-gnueabi-objcopy
QMAKE_NM                = /usr/local/arm/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/arm-fsl-linux-gnueabi-nm -P
QMAKE_STRIP             = /usr/local/arm/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/arm-fsl-linux-gnueabi-strip
load(qt_config)

4、修改完成后返回顶层目录/opt/qt-everywhere-opensource-src-xxx。这时候要通过执行configure来生成Makefile文件了。我这里通过写一个脚本来自动生成Makefile文件,说白了就是把configure的参数写在脚本文件中。
vim autoConfigure.sh

#!/bin/sh
./configure \
-v \
-prefix /usr/local/Qt-5.5.0-arm \   //指定安装的位置
-release \
-opensource \
-no-accessibility \
-make libs \
-xplatform linux-arm-gnueabi-g++ \  // 指定平台 linux-arm-gnueabi-g++ 就是上面我们编辑  qmake.conf的那个文件夹
-optimized-qmake \
-pch \
-qt-sql-sqlite \
-qt-zlib \
-tslib \
-no-opengl \
-no-sse2 \
-no-openssl \
-no-nis \
-no-cups \
-no-glib \
-no-pkg-config \
-no-separate-debug-info \
-I/usr/local/arm/tslib/include -L/usr/local/arm/tslib/lib   //指定tslib库,这是我linux中tslib库的路径
  • configure下各个参数的含义
  •  -prefix  ...... The deployment directory, as seen on the target device.
                       (default /usr/local/Qt-5.6.0, $PWD if -developer-build is active) 
     -prefix  这个指定 make 完成后make install 的目录,不指定的话默认是/usr/local/Qt-5.6.0
     -release :Compile and link Qt with debugging turned off.    
     -debug :Compile and link Qt with debugging turned on.        
     -debug-and-release . Compile and link two versions of Qt, with and without  
                       debugging turned on (Mac only).                        
     -force-debug-info .. Create symbol files for release builds.                                                                                    
     -developer-build ... Compile and link Qt with Qt developer options (including auto-tests exporting)
     -release  编译以及链接qt  但是关闭调试。一般的话  交叉编译qt的源码都选择这个选项。
     -debug , 开启调试的接口
     -debug-and-release 编译成上面连个版本。
     -force-debug-info 创建字符文件为了记录版本
     -developer-build  编译和链接qt 而且加入开发者选项(包含自己测试输出)。
     -no-optimized-tools ... Do not build optimized host tools even in debug build.
     -optimized-tools ...... Build optimized host tools even in debug build.     
     -opensource ........ Compile and link the Open-Source Edition of Qt.        
     -commercial ........ Compile and link the Commercial Edition of Qt.         
     -confirm-license ... Automatically acknowledge the license (use with        
                       either -opensource or -commercial)                     
     -c++std  .. Compile Qt with C++ standard edition (c++98, c++11, c++14, c++1z)
                       Default: highest supported                             
     前面两个是 是否要建立优化主工具当调试的时候,一般会选择 -no-optimized-tools
     -opensource  编译和链接开源QT版本,一般的话我们都是使用的开源的QT版本。
     -commercial  编译和链接商业QT版本。
     -confirm-license 自动确认是否是开源还是商业的。
     -c++std <>  编译QT 是使用的什么版本的c++ ,默认为最高版本
     -shared: Create and use shared Qt libraries.                    
     -static: Create and use static Qt libraries.                    
     -no-largefile ...... Disables large file support.                         
     -largefile ......... Enables Qt to access files larger than 4 GB.                                                                                    
       -no-accessibility .. Do not compile Accessibility support.                  
                       Disabling accessibility is not recommended, as it will break QStyle
                       and may break other internal parts of Qt.              
                       With this switch you create a source incompatible version of Qt,
                       which is unsupported.                                  
    -accessibility ..... Compile Accessibility support.                         
                                                                              
    -no-sql- ... Disable SQL  entirely.                         
    -qt-sql- ... Enable a SQL  in the Qt SQL module, by default 
                       none are turned on.                                    
    第一个比较容易理解: 是编译成动态库还是静态库,一般的话我们编译的都是动态库,这样的话软件的大小不会那么大, 选择的是 -shared
    第二个是是否允许大文件支持, 这个我还没没有试过。 一般选择的都是默认的,默认是 -largefile
    
    第三个是易接近支持, 因为不同版本的qt都做了一些相关的改动, 一般的话都选择默认, 这样的话可以提高软件的可移植性。 -accessibility
    
    第四个是SQL 驱动模块的指定。我这里是没有这个模块的驱动的,所以我不去指定这个选项一般
    
     -plugin-sql- Enable SQL  as a plugin to be linked to  at run time.                                           
                                                                              
                       Possible values for :                          
                       [ db2 ibase mysql oci odbc psql sqlite sqlite2 tds ]   
                                                                             
    -system-sqlite: Use sqlite from the operating system.                                                                                               
    -no-qml-debug : Do not build the in-process QML debugging support.     
    -qml-debug ......... Build the QML debugging support.                                                                                                
    -platform target ... The operating system and compiler you are building     
                       on (default detected from host system).                
                                                                              
                       See the README file for a list of supported            
                       operating systems and compilers.                                                                                 
     前面两个还是关于sql 的。一个允许sql作为一个插件在运行的时候,一个使用系统的sqlite 
     下面那个是指定是否编译QML 调试支持, 一般我选择的是:-no-qml-debug
     第三块是选择目标平台:默认是选择本机的操作系统, 阅读顶层目录的readme 可以知道支持哪些操作系统。
     -qtnamespace   Wraps all Qt library code in 'namespace  {...}'. 
     -qtlibinfix   Renames all libQt*.so to libQt*.so.                                                                                   
     -testcocoon ........ Instrument Qt with the TestCocoon code coverage tool.  
     -gcov .............. Instrument Qt with the GCov code coverage tool.        
     -D  ........ Add an explicit define to the preprocessor.            
     -I  ........ Add an explicit include path.                          
     -L  ........ Add an explicit library path.                     
    

第一个是qt命名空间的, 一般不修改。
第二个是对qt库的重命名,加一些后缀。一般我们也用不到。
第三第四个是关于testcocoon 和 GCov的工具,一般我也不会去指定
后面三个第一个是 在预处理的时候加一个前缀,第二个是添加一个额外的头文件目录,第三个是添加一个额外的库目录

 -pkg-config ........ Use pkg-config to detect include and library paths. By default,
                     configure determines whether to use pkg-config or not with
                     some heuristics such as checking the environment variables.
-no-pkg-config ..... Disable use of pkg-config.                             
-force-pkg-config .. Force usage of pkg-config (skips pkg-config usability  
                     detection heuristic).                                  
                                                                            
-help, -h .......... Display this information.                              

第一个是指定是否支持pkg-config 它回去寻找属于你的头文件以及库,后面还有一个强迫使用,意思就是必须使用。
第二个是打印帮助。

Third Party Libraries:

  • -qt-zlib … Use the zlib bundled with Qt.

  • -system-zlib … Use zlib from the operating system.
    See http://www.gzip.org/zlib

  • -no-mtdev … Do not compile mtdev support.

  • -mtdev … Enable mtdev support.

  • -no-journald … Do not send logging output to journald.
    -journald … Send logging output to journald.

  • -no-syslog … Do not send logging output to syslog.
    -syslog … Send logging output to syslog.

    -no-gif … Do not compile GIF reading support.

    -no-libpng … Do not compile PNG support.
    -qt-libpng … Use the libpng bundled with Qt.

  • -system-libpng … Use libpng from the operating system.
    See http://www.libpng.org/pub/png

    -no-libjpeg … Do not compile JPEG support.
    -qt-libjpeg … Use the libjpeg bundled with Qt.

  • -system-libjpeg … Use libjpeg from the operating system.
    See http://www.ijg.org
    第一个是zlib 库, 默认是系统的zlib , 但是我们要选 -qt-zlib ,不要问我为什么, 因为我现在是在做移植,系统的是X86架构的,板子不一样。
    第二个是mtdev 支持, 是触摸屏多点控制协议的支持。如果你的触摸屏要多点控制,那就加上。 -medev.
    第三个是输入日志支持,有必要的话可以加上。 -syslog , 一般的话我选择默认。
    第四个是指定没有gif 阅读功能 , 我都不需要这个功能, 所以我会加上 -no-gif。
    第五个是指定是否支持PNG 这个我一般也是会加上 -no-libpng , 或者是-qt-libpng。
    第六个是指定jpeg 库支持, 和上面那个同理,-no-libjpeg或者是 -qt-libjpeg。

-no-freetype … Do not compile in Freetype2 support.
-qt-freetype … Use the libfreetype bundled with Qt.

  • -system-freetype… Use the libfreetype provided by the system (enabled if -fontconfig is active).
    See http://www.freetype.org

    -no-harfbuzz … Do not compile HarfBuzz-NG support.

  • -qt-harfbuzz … Use HarfBuzz-NG bundled with Qt to do text shaping.
    It can still be disabled by setting
    the QT_HARFBUZZ environment variable to “old”.
    -system-harfbuzz … Use HarfBuzz-NG from the operating system
    to do text shaping. It can still be disabled
    by setting the QT_HARFBUZZ environment variable to “old”.
    See http://www.harfbuzz.org

    -no-openssl … Do not compile support for OpenSSL.

  • -openssl … Enable run-time OpenSSL support.
    -openssl-linked … Enabled linked OpenSSL support.

    -no-libproxy … Do not compile support for libproxy

  • -libproxy … Use libproxy from the operating system.

第一个是 freetype2 的编译支持。 一般我会选择-no-freetype 或者是-qt-freetype . 原则是只要是有关操作系统,最好不要有system 字眼。
第二个是有关字体的。一般我会选择-qt-harfbuzz.
第三个是 openssl ,一般我会选择-no-openssl 。
第四个是 proxy , 最好不要搭上本机操作系统 , -no-libproxy

-qt-pcre … Use the PCRE library bundled with Qt.

  • -system-pcre … Use the PCRE library from the operating system.

    -qt-xcb … Use xcb- libraries bundled with Qt.
    (libxcb.so will still be used from operating system).

  • -system-xcb … Use xcb- libraries from the operating system.

    -xkb-config-root … Set default XKB config root. This option is used only together with -qt-xkbcommon-x11.
    -qt-xkbcommon-x11 … Use the xkbcommon library bundled with Qt in combination with xcb.

  • -system-xkbcommon-x11 Use the xkbcommon library from the operating system in combination with xcb.

    -no-xkbcommon-evdev . Do not use X-less xkbcommon when compiling libinput support.

  • -xkbcommon-evdev … Use X-less xkbcommon when compiling libinput support.
    pcre 是一个c语言编写的正则表达式库,这里的话可以不指定。
    xcb 这里的话我指定的是qt-xcb
    xkb 这里的话我没去搭理他,

-no-xinput2 … Do not compile XInput2 support.

  • -xinput2 … Compile XInput2 support.

    -no-xcb-xlib… Do not compile Xcb-Xlib support.

  • -xcb-xlib… Compile Xcb-Xlib support.

    -no-glib … Do not compile Glib support.

  • -glib … Compile Glib support.

    -no-pulseaudio … Do not compile PulseAudio support.

  • -pulseaudio … Compile PulseAudio support.

    -no-alsa … Do not compile ALSA support.

  • -alsa … Compile ALSA support.

    -no-gtkstyle … Do not compile GTK theme support.

  • -gtkstyle … Compile GTK theme support.

xinput2 是关乎多点触摸的, 现在我还没有用到,所以我忽略了他。
xcb-xlib 我也没有去管他。
glib 我是直接给了 -no-glib
pulseaudio 这是关于声音系统的。我给了是默认
alsa 这是音频子系统的支持。 也是默认就行了。
gtkstype GTK 主题支持,这个还是算了吧,我只求能移植成功,功能不要太炫。

Additional options:

-make  ....... Add part to the list of parts to be built at make time.
                     (defaults to: libs tools examples)                     
-nomake  ..... Exclude part from the list of parts to be built.       
                                                                            
-skip  ..... Exclude an entire module from the build.               
                                                                            
-no-compile-examples ... Install only the sources of examples.              
                                                                            
-no-gui ............ Don't build the Qt GUI module and dependencies.        
  • -gui … Build the Qt GUI module and dependencies.

    -no-widgets … Don’t build the Qt Widgets module and dependencies.

  • -widgets … Build the Qt Widgets module and dependencies.

第一个是让你选择要不要编译某些另外的模块, 比如说libs , tools , examples .我现在是把所有的加上,因为移植进去了就可以直接用 examples里面的程序执行看一下是否移植成功。

第二项是 gui 支持,我直接加上吧。
第三个 widgets 也是差不多,也是直接上了。

-R … Add an explicit runtime library path to the Qt
libraries.
-l … Add an explicit library.

-no-rpath .......... Do not use the library install path as a runtime       
                     library path. On Apple platforms, this implies using   
                     absolute install names (based in -libdir) for dynamic  
                     libraries and frameworks.                              
  • -rpath … Link Qt libraries and executables using the library
    install path as a runtime library path. Equivalent
    to -R install_libpath

    -continue … Continue as far as possible if an error occurs.

    -verbose, -v … Print verbose information about each step of the
    configure process.

    -silent … Reduce the build output so that warnings and errors
    can be seen more easily.

第一项是添加一个库在Qt程序执行时,这个我不管我选默认。

第二项是添加一个库
我一般给这个rpath 给默认值。
-continue 是指定如果出现某个错误指令继续的命令。
-v 是指打印详细的信息关于每个配置程序

-silent 是指定减少输出的信息,这样的话查找错误就更容易。

-no-cups … Do not compile CUPS support.

  • -cups … Compile CUPS support.
    Requires cups/cups.h and libcups.so.2.

    -no-iconv … Do not compile support for iconv(3).

  • -iconv … Compile support for iconv(3).

    -no-evdev … Do not compile support for evdev.

  • -evdev … Compile support for evdev.

    -no-tslib … Do not compile support for tslib.

  • -tslib … Compile support for tslib.

    -no-icu … Do not compile support for ICU libraries.

  • -icu … Compile support for ICU libraries.

-cups 是打印管理的一个支持, 一般的话选择默认就好。
-iconv 这是文本编码转化功能,这个网上有些教程说应该去掉这个功能 所以选择 -no-iconv, 目前还没有试验。
 -evdev 这个选择默认就行。
-tslib 这个是触摸屏矫正的一个功能。这个还是要加上。
-icu 这个选项还是选择默认。

-no-linuxfb … Do not compile Linux Framebuffer support.

  • -linuxfb … Compile Linux Framebuffer support.

    -no-opengl … Do not support OpenGL.
    -opengl … Enable OpenGL support
    With no parameter, this will attempt to auto-detect
    OpenGL ES 2.0 and higher, or regular desktop OpenGL.
    Use es2 for to override auto-detection.

这连个选项, 使用linuxfb 的支持已经忽略opengl
-linux -no-opengl
5、写好了脚本后就更改好权限并执行

chmod 777 autoConfigure.sh
./autoConfigure.sh

6、执行完毕之后,就会在目录下发现Makefile文件。
7、执行make,这是一个漫长的过长,估计要等一个半钟左右。
8、执行make install,最后Qt5移植完成了,在安装目录下/usr/local/Qt-xxx-arm/bin,就会发现ARM版本的qmake,如果是编译ARM版本的Qt程序,就需要用到这个qmake。

四、配置交叉编译工具链

1、首先打开QtCreator->Tools->Options->Build &Run -> Compieirs如下图所示
ubuntu下移植编译arm架构的QT_第1张图片
2、点击add->gcc,添加交叉编译工具链,在Name中输入名字(随便起一个吧),Complier path中输入你的交叉编译工具链在linux上的绝对路径。
3、Apply 、 OK。

五、配置qmake

1、首先打开QtCreator->Tools->Options->Build &Run -> Qt Version如下图所示
ubuntu下移植编译arm架构的QT_第2张图片
点击add,在version name输入名字(随便写一个),在 qmake location 中填入ARM版本qmake的绝对路径。其中ARM版本的qmake,需要通过移植Qt才能产生。

六、配置Kits工具

1、首先打开QtCreator->Tools->Options->Build &Run -> Kits如下图所示
ubuntu下移植编译arm架构的QT_第3张图片
2、点击Add、在Complier处选择刚才配置好的交叉编译工具链的名字,在Qt Version处选择刚才配置好的qmake的名字。
3、Apply 、OK。

七、开始编译ARM版本的Qt程序

ubuntu下移植编译arm架构的QT_第4张图片
1、首先点击clean all 来清除项目的编译信息。

2、点击 build all 来编译项目。

八、在目标板上运行

1、将编译好的QT拷贝到目标板上,这里放到/opt目录下。

2、指定QT的运行平台,这里使用linuxfb,QT有几种运行平台,在官网上有说明,这里使用linuxfb,新建一个文件setqtenv.sh,写下如下内容:

 export QTDIR=/opt/QT5.5
 export QT_QPA_FONTDIR=QTDIR/lib/fonts
 export QT_QPA_PLATFORM_PLUGIN_PATH=$QTDIR/plugins/
 export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
 export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size=800x600:mmSize=800x600:offset=0x0:tty=/dev/tty1

如果不指定QT_QPA_FONTDIRQT就会到/QT5.5的路径下去找字体,结果就找不到了。如果不指定QT_QPA_PLATFORM_PLUGIN_PATH,应用程序启动的时候就会提示找不到linuxfb,linuxfb是QT的一个插件,可以在/opt/QT5.5/plugins/platforms/文件夹下看到一个libqlinuxfb.so。LD_LIBRARY_PATH是指定库的路径,这个就不说了,最熟悉的东西了。QT_QPA_PLATFORM是指定平台,fb指定framebuffer的设备地址,具体的参数在官网上有说明参见上面给出的链接。然后运行source setqtenv.sh添加这些环境变量,至此,界面就可以显示出来了。

你可能感兴趣的:(qt交叉编译arm)