Qt-4.8.7交叉编译平台的搭建、移植详解

        由于项目需要,需要在国产系统(银河麒麟系统--飞腾cpu-arm64)上用firefox加载一个npapi插件,而firefox是一个32位的浏览器,而银河麒麟系统不支持编译32位的动态库,因此只能用交叉编译环境来编译arm32的动态库。

        整了一个星期的Qt移植,今天终于弄出来了。网上的移植教程很多,可没有一篇能够完整编译出自己需要的版本,因此记录一下学习过程以及编译过程中所遇到的问题。   

        首先理解一下QT相关知识:Qt平台在Linux 下分为两个平台:qt-x11和qt-embeddedqt-x11是使用X11的图形库,比较大,主要是使用在PC机上; 而qt-embedded使用的是qt专门为嵌入式系统设计的图形库,其库文件较小,主要用于嵌入式板上。而我主要编译的是qt-x11版本。

  • 一、环境准备:

        我的机器环境是:ubuntu 16-04 LTS版本,如图:

Qt-4.8.7交叉编译平台的搭建、移植详解_第1张图片

  1.  准备交叉编译环境

         首先安装交叉编译器,在银河麒麟系统下面,查看系统的文件目录,发现使用的交叉编译器为:arm-linux-gnueabihf(关于交叉编译器的相关信息详见参考资料1、2)。因此在ubuntu环境下安装arm-linux-gnueabihf。在终端中输入arm-linux-gnueabihf-g++,提示如下:

Qt-4.8.7交叉编译平台的搭建、移植详解_第2张图片

        使用安装命令:

sudo apt-get install g++-arm-linux-gnueabihf

        使用一下命令查看是否安装成功:

arm-linux-gnueabihf-g++ --version

        显示结果如下表示安装成功。

Qt-4.8.7交叉编译平台的搭建、移植详解_第3张图片

         2. 准备qt编译环境

        下载qt-everywhere-opensource-src-4.8.7.tar.gz

                Qt-4.8.7交叉编译平台的搭建、移植详解_第4张图片

        提前安装各种软件及依赖库

sudo apt-get install libx11-dev libxext-dev libxtst-dev zlib1g-dev lib32ncurses5 lib32z1 

二、交叉编译QT4.8.7

        将下载的qt-everywhere-opensource-src-4.8.7.tar.gz执行如下命令解压:

tar -xzvf qt-everywhere-opensource-src-4.8.7.tar.gz
        进入qt源码目录:
cd ./qt-everywhere-opensource-src-4.8.7

        在/mkspecs/qws/目录下,新建一个文件夹,命名为linux-arm-gnueabihf-g++,然后复制其他文件夹下的qmake.conf以及qplatformdefs.h文件到当前目录,并修改qmake.conf,修改后的内容如下:

#
# qmake configuration for building with arm-none-linux-gnueabihf-g++
#

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

# modifications to g++.conf
QMAKE_CC                = arm-linux-gnueabihf-gcc
QMAKE_CXX               = arm-linux-gnueabihf-g++
QMAKE_LINK              = arm-linux-gnueabihf-g++
QMAKE_LINK_SHLIB        = arm-linux-gnueabihf-g++

# modifications to linux.conf
QMAKE_AR                = arm-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY           = arm-linux-gnueabihf-objcopy
QMAKE_STRIP             = arm-linux-gnueabihf-strip

load(qt_config)

        进入到qt源码主目录,执行编译命令:

./configure -opensource -confirm-license  -xplatform qws/linux-arm-gnueabihf-g++  -shared -no-qt3support -no-phonon -no-phonon-backend -qt-zlib -no-gif -no-libtiff -no-qvfb -qt-libjpeg -no-nis -no-opengl -no-cups -no-webkit -no-glib -no-dbus -no-rpath -no-mmx -no-3dnow -no-sse -no-sse2 -no-sse3 -no-ssse3 -no-sse4.1 -no-sse4.2 -no-avx -no-neon -no-audio-backend -no-svg -no-javascript-jit -no-script -no-scripttools -no-multimedia -no-openssl -nomake tools -nomake examples -nomake demos

        执行完上面命令后,执行make命令,编译过程中,会遇到第一个问题,问题截图如下:

Qt-4.8.7交叉编译平台的搭建、移植详解_第5张图片

        这是因为在编译arm下的动态库,而arm找不到,因此只需要在编译时定义一个宏(DQT_ARCH_ARM)即可。即重新执行下面的命令:

./configure -opensource -confirm-license  -xplatform qws/linux-arm-gnueabihf-g++  -shared -no-qt3support -no-phonon -no-phonon-backend -qt-zlib -no-gif -no-libtiff -no-qvfb -qt-libjpeg -no-nis -no-opengl -no-cups -no-webkit -no-glib -no-dbus -no-rpath -no-mmx -no-3dnow -no-sse -no-sse2 -no-sse3 -no-ssse3 -no-sse4.1 -no-sse4.2 -no-avx -no-neon -no-audio-backend -no-svg -no-javascript-jit -no-script -no-scripttools -no-multimedia -no-openssl -nomake tools -nomake examples -nomake demos -DQT_ARCH_ARM

        执行完后,,继续执行make命令,会遇到下面这个问题:

Qt-4.8.7交叉编译平台的搭建、移植详解_第6张图片

        出现这个问题的原因是没有引用到X11的一系列动态库文件,因此需要在/src/gui/Makefile下添加动态库所在的位置(使用-L)以及需要的动态库名称(-l):

-L/home/luyp/workspace/arm-linux-gnueabihf  -lX11 -lXext -lXrender -lICE -lSM -lfreetype -lfontconfig 
        继续执行make命令,然后编译成功后,执行make install命令后,将所有的头文件、执行文件以及库文件放入了/usr/local/Trolltech/Qt-4.8.7/下。


参考资料

1、交叉编译器 arm-linux-gnueabi 和 arm-linux-gnueabihf 的区别:http://www.cnblogs.com/xiaotlili/p/3306100.htm

2、What's the difference between arm-linux- / arm-none-linux-gnueabi- / arm-fsl-linux-gnueabi- in LTIB?https://community.freescale.com/thread/313490


 


       



你可能感兴趣的:(linux)