Qt-4.8.7交叉编译平台的搭建、移植详解( aarch32、aarch64 、mips64)「建议收藏」

Qt-4.8.7交叉编译平台的搭建、移植详解( aarch32、aarch64 、mips64)「建议收藏」由于项目需要,需要在国产系统(银河麒麟系统–飞腾cpu-arm64)上用firefox加载一个npapi插件,而firefox是一个32位的浏览器,而银河麒麟系统不支持编译32位的动态库,因此只能用交叉编译环境来编译arm32的动态库。整了一个星期的Qt移植,今天终于弄出来了。网上的移植教程很多,可没有一篇能够完整编译出自己需要的版本,因此记录一下学习过程以及编译…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

        由于项目需要,需要在国产CPU上开发软件,但由于环境众多,因此在ubuntu 14.04上进行交叉编译环境的搭建。基于国产化芯片arm64架构(飞腾、鲲鹏)、mips64架构(龙芯)。

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

一、环境准备:

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

Qt-4.8.7交叉编译平台的搭建、移植详解( aarch32、aarch64 、mips64)「建议收藏」

 

1. 准备下载相关的交叉编译器gcc

      (1)、aarch32架构的交叉编译器

              因为系统是ubuntu 14-04的版本,可以直接使用安装的方式去安装aarch32架构的交叉编译器。也可以按照aarch64架构的方式去下载aarch32的交叉编译器,建议g++版本低一点,4.8.4左右。

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

             执行命令成功后,使用 命令 arm-linux-gnueabihf-g++ -v 查看到安装的版本值,安装成功! 版本值显示如下图:

Qt-4.8.7交叉编译平台的搭建、移植详解( aarch32、aarch64 、mips64)「建议收藏」

      (2)、aarch64架构的交叉编译器

                首先找到arm64架构的交叉编译器的官网地址(https://releases.linaro.org/components/toolchain/binaries/),如下图:

Qt-4.8.7交叉编译平台的搭建、移植详解( aarch32、aarch64 、mips64)「建议收藏」

                选择对应的版本(我选择的是5.4-2017.01),进入后的截图如下:

Qt-4.8.7交叉编译平台的搭建、移植详解( aarch32、aarch64 、mips64)「建议收藏」

                然后选择aarch64-linux-gnu选项,进入后截图如下:然后根据自己要交叉编译的环境来选择对应的gcc包,我选择的是gcc-linaro-5.4.1-2017.01-x86_64_aarch64-linux-gnu.tar.xz( l链接地址:https://releases.linaro.org/components/toolchain/binaries/5.4-2017.01/aarch64-linux-gnu/gcc-linaro-5.4.1-2017.01-x86_64_aarch64-linux-gnu.tar.xz ),这个包,下载即可。

Qt-4.8.7交叉编译平台的搭建、移植详解( aarch32、aarch64 、mips64)「建议收藏」

(3)、mips64架构的交叉编译器

                在http://www.loongnix.org/index.php/Cross-compile中下载交叉编译器,选择对应的版本,下载即可。如下图:

Qt-4.8.7交叉编译平台的搭建、移植详解( aarch32、aarch64 、mips64)「建议收藏」

(4)、i386/i586/i686架构

           安装对应版本的qt4库:

                     

sudo apt-get install libqt4-dev:i386

           然后在编译的时候将-m64改为-m32即可。

 2. 准备qt编译环境

                在qt官网http://download.qt.io/archive/qt/4.8/4.8.7/中下载qt-everywhere-opensource-src-4.8.7.tar.gz,如下图:

                Qt-4.8.7交叉编译平台的搭建、移植详解( aarch32、aarch64 、mips64)「建议收藏」

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

sudo apt-get install libx11-dev libxext-dev libxtst-dev zlib  libXinerama-dev libXrandr-dev libXcursor-dev libfontconfig-dev  libSM-dev

二、交叉编译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

    1、aarch32架构的相关设置与问题

             在qt源代码目录中,进入/mkspecs/qws/目录下,新建一个linux-arm-gnueabihf-g++文件夹,把同目录其他文件下的文件qmake.conf、qplatformdefs.h拷贝到linux-arm-gnueabihf-g++目录,并修改qmake.conf,修改后的内容如下:

Qt-4.8.7交叉编译平台的搭建、移植详解( aarch32、aarch64 、mips64)「建议收藏」

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

./configure -opensource -confirm-license  -xplatform qws/linux-arm-gnueabihf-g++  -shared -no-qt3support  -no-phonon -no-phonon-backend -qt-zlib  -qt-libpng -qt-libtiff -no-qvfb -qt-libjpeg -no-nis -no-opengl -no-cups -no-webkit -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 --prefix=../aarch32-qt-output4.8

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

Qt-4.8.7交叉编译平台的搭建、移植详解( aarch32、aarch64 、mips64)「建议收藏」

这是因为在编译aarch32架构的动态库时,而arm指令集找不到,因此需要在执行配置时指定编译的架构,即添加:-DQT_ARCH_ARM。即重新执行下面的命令:

./configure -opensource -confirm-license  -xplatform qws/linux-arm-gnueabihf-g++  -shared -no-qt3support  -no-phonon -no-phonon-backend -qt-zlib  -qt-libpng -qt-libtiff -no-qvfb -qt-libjpeg -no-nis -no-opengl -no-cups -no-webkit -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 --prefix=../aarch32-qt-output4.8 -DQT_ARCH_ARM

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

Qt-4.8.7交叉编译平台的搭建、移植详解( aarch32、aarch64 、mips64)「建议收藏」

 因为使用的是系统安装的g++-arm-linux-gnueabihf软件,而默认是没有安装aarch32版本的x11文件的,因此GUI库从/usr/arm-linux-gnueabihf/include目录中时找不到X11系列的头文件的免得去修改前面编译好的库。偷懒了,因此在/src/gui/Makefile中添加头文件位置:

-I/usr/include

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

Qt-4.8.7交叉编译平台的搭建、移植详解( aarch32、aarch64 、mips64)「建议收藏」

  出现这个问题的原因是在编译aarch64架构的GUI库时,需要连接aarch64架构的X11系列的库(注意:需要去下载aarch64架构的X11系列库),因此需要在/src/gui/Makefile下添加动态库所在的位置(使用-L)以及需要的动态库名称(-l):

-L/home/luyp/aarch32/arm-linux-gnueabihf -lX11 -lXext -lXrender -lICE -lSM -lfreetype -lfontconfig 

        继续执行make命令,然后编译成功后,执行make install命令后,将所有的头文件、执行文件以及库文件放入了指定目录((../aarch32-qt-output4.8))下。截图如下:

Qt-4.8.7交叉编译平台的搭建、移植详解( aarch32、aarch64 、mips64)「建议收藏」

             然后进入lib目录,使用file *命令查看生成的动态库类型,如果显示为下图,则表示生成aarch32架构的qmake以及qt库成功。

Qt-4.8.7交叉编译平台的搭建、移植详解( aarch32、aarch64 、mips64)「建议收藏」

    2、aarch64架构的相关设置与问题

             将前面下载的gcc-linaro-5.4.1-2017.01-x86_64_aarch64-linux-gnu.tar.xz包,解压缩到指定目录。解压后的目录截图如下:

           Qt-4.8.7交叉编译平台的搭建、移植详解( aarch32、aarch64 、mips64)「建议收藏」

   在qt源代码目录中,进入/mkspecs/qws/linux-arm-g++目录下,修改qmake.conf,修改后的内容如下:

Qt-4.8.7交叉编译平台的搭建、移植详解( aarch32、aarch64 、mips64)「建议收藏」

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

./configure -opensource -confirm-license  -xplatform qws/linux-arm-g++  -shared -no-qt3support  -no-phonon -no-phonon-backend -qt-zlib  -qt-libpng -qt-libtiff -no-qvfb -qt-libjpeg -no-nis -no-opengl -no-cups -no-webkit -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 --prefix=../aarch64-qt-output4.8

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

Qt-4.8.7交叉编译平台的搭建、移植详解( aarch32、aarch64 、mips64)「建议收藏」

 

        这是因为在编译aarch64架构的动态库时,默认使用的是x86_64架构, 而arm指令集找不到,因此需要在执行配置时指定编译的架构,即添加:-arch generic。即重新执行下面的命令:

./configure -opensource -confirm-license  -xplatform qws/linux-arm-g++  -shared -no-qt3support  -no-phonon -no-phonon-backend -qt-zlib  -qt-libpng -qt-libtiff -no-qvfb -qt-libjpeg -no-nis -no-opengl -no-cups -no-webkit -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 --prefix=../aarch64-qt-output4.8 -arch generic

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

Qt-4.8.7交叉编译平台的搭建、移植详解( aarch32、aarch64 、mips64)「建议收藏」

       出现这个问题的原因是GUI库没有引用到X11的头文件,免得去修改前面编译好的库,偷懒了,因此在/src/gui/Makefile中添加头文件位置:

-I/usr/include

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

Qt-4.8.7交叉编译平台的搭建、移植详解( aarch32、aarch64 、mips64)「建议收藏」

      出现这个问题的原因是在编译aarch64架构的GUI库时,需要连接aarch64架构的X11系列的库(注意:需要去下载aarch64架构的X11系列库),因此需要在/src/gui/Makefile下添加动态库所在的位置(使用-L)以及需要的动态库名称(-l):

-L/home/luyp/aarch64/usr-arm64/usr/lib/aarch64-linux-gnu -lX11 -lXext -lXrender -lICE -lSM -lfreetype -lfontconfig

        继续执行make命令,然后编译成功后,执行make install命令后,将所有的头文件、执行文件以及库文件放入了指定的目录(../aarch64-qt-output4.8)下。

Qt-4.8.7交叉编译平台的搭建、移植详解( aarch32、aarch64 、mips64)「建议收藏」

        然后进入lib目录,使用file *命令查看生成的动态库类型,如果显示为下图,则表示生成aarch64架构的qmake以及qt库成功。

Qt-4.8.7交叉编译平台的搭建、移植详解( aarch32、aarch64 、mips64)「建议收藏」

     3.mips64架构的相关设置与问题

             将前面下载的cross-gcc-4.9.3-n64-loongson-rc6.1.tar.bz2包,解压缩到指定目录。解压后的目录截图如下:

   Qt-4.8.7交叉编译平台的搭建、移植详解( aarch32、aarch64 、mips64)「建议收藏」

             在qt源代码目录中,进入/mkspecs/qws/linux-mips-g++目录下,修改qmake.conf,修改后的内容如下:

Qt-4.8.7交叉编译平台的搭建、移植详解( aarch32、aarch64 、mips64)「建议收藏」

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

./configure -opensource -confirm-license  -xplatform qws/linux-mips-g++  -shared -no-qt3support  -no-phonon -no-phonon-backend -qt-zlib  -qt-libpng -qt-libtiff -no-qvfb -qt-libjpeg -no-nis -no-opengl -no-cups -no-webkit -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 --prefix=../mips64-qt-output4.8

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

Qt-4.8.7交叉编译平台的搭建、移植详解( aarch32、aarch64 、mips64)「建议收藏」

        在龙芯3A3000的电脑上进行查看,发现是MIPS Little Endian模式,因此添加-little-endian选项。执行代码如下:

./configure -opensource -confirm-license  -xplatform qws/linux-mips-g++  -shared -no-qt3support  -no-phonon -no-phonon-backend -qt-zlib  -qt-libpng -qt-libtiff -no-qvfb -qt-libjpeg -no-nis -no-opengl -no-cups -no-webkit -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 --prefix=../mips64-qt-output4.8 -little-endian

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

Qt-4.8.7交叉编译平台的搭建、移植详解( aarch32、aarch64 、mips64)「建议收藏」

       使用find命令查找libopcodes-2.24.so库所在那些目录,执行命令为:sudo find / -name ‘libopcodes*’  搜索结果如下:

Qt-4.8.7交叉编译平台的搭建、移植详解( aarch32、aarch64 、mips64)「建议收藏」

      发现libopcodes-2.24.so库所在目录在/home/luyp/mips64/cross-gcc-4.9.3-n64-loongson-rc6.1/usr/x86_64-unknown-linux-gnu/mips64el-loongson-linux/lib中,因此将该目录放入到环境变量(.bashrc)中,使用vim命令打开.bashrc,加入环境变量(export LD_LIBRARY_PATH=/home/luyp/mips64/cross-gcc-4.9.3-n64-loongson-rc6.1/usr/x86_64-unknown-linux-gnu/mips64el-loongson-linux/lib:$LD_LIBRARY_PATH
),加入后,保存退出,使用source命令更新环境变量(source ~/.bashrc),然后重新执行make命令。截图如下:

Qt-4.8.7交叉编译平台的搭建、移植详解( aarch32、aarch64 、mips64)「建议收藏」

      编译过程中,有可能会遇到下面问题,问题截图如下:

Qt-4.8.7交叉编译平台的搭建、移植详解( aarch32、aarch64 、mips64)「建议收藏」

         这是因为在编译mips64架构的动态库时,默认使用的是x86_64架构,因此找不到asm指令集。因此需要在执行配置时指定编译的架构,即添加:-arch generic。即重新执行下面的命令:

./configure -opensource -confirm-license  -xplatform qws/linux-mips-g++  -shared -no-qt3support  -no-phonon -no-phonon-backend -qt-zlib  -qt-libpng -qt-libtiff -no-qvfb -qt-libjpeg -no-nis -no-opengl -no-cups -no-webkit -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 --prefix=../mips64-qt-output4.8 -little-endian -arch generic

         同样的也会遇到x11库的问题:

Qt-4.8.7交叉编译平台的搭建、移植详解( aarch32、aarch64 、mips64)「建议收藏」

Qt-4.8.7交叉编译平台的搭建、移植详解( aarch32、aarch64 、mips64)「建议收藏」

          因此在GUI库的makefile中加入X11的头文件以及相对应的动态库。

-I/usr/include
-L/home/luyp/mips64/usr-mips64/usr/lib64  -lX11 -lXext -lXrender -lICE -lSM -lfreetype -lfontconfig

         继续执行make命令,然后编译成功后,执行make install命令后,将所有的头文件、执行文件以及库文件放入了指定的目录(../mips64-qt-output4.8)下。

Qt-4.8.7交叉编译平台的搭建、移植详解( aarch32、aarch64 、mips64)「建议收藏」

        然后进入lib目录,使用file *命令查看生成的动态库类型,如果显示为下图,则表示生成mips64el架构的qmake以及qt库成功。

Qt-4.8.7交叉编译平台的搭建、移植详解( aarch32、aarch64 、mips64)「建议收藏」

参考资料

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

       

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/184223.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pychorm激活码【中文破解版】

    (pychorm激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html0UY7RF7AC5-eyJsaWNlbnNlSWQi…

    2022年3月28日
    37
  • 手把手教你搭建基于ngrok私有云存储服务「建议收藏」

    手把手教你搭建基于ngrok私有云存储服务「建议收藏」前段时间,闲置了个1核1G1M的服务器,就搞了个树莓派玩玩,随手搭建了个私有云存储,也看了一些教程,发现坑比较多,自己就重写个准备工作申请域名,如domain.cn可远程访问的服务器一台(linux64),并且备案(未备案域名只能用大陆外服务器)设置域名解析,如ngrok.domain.cn申请域名所需SSL证书(非必须,除非你要开启https访问)服务端安装服务器安装unzip解压命令yuminstall-yunzip下载服务端文件server.zip解压后启动,启动

    2022年6月22日
    20
  • 树莓派 网络设置_树莓派4b教程

    树莓派 网络设置_树莓派4b教程概览你想做的第一件事一定是把你的树莓派连接到因特网上。在这节课里,你将会学到如何:使用网线连接到以太网在Raspbian和Occidentalis上使用无线网卡找到树莓派的IP地址使用有线网络最快的把树莓派接入到因特网的方法是使用一根以太网线把树莓派连接到你家的路由器上。当你把网线连入树莓派的时候,你就会看到网络LED灯开始闪烁了。对于大多数的家庭网络来说,你就不需要再做任何进一步的配置了。但为了…

    2022年9月13日
    0
  • 关于this指针

    关于this指针一个类的对象中实际只包含了该对象的数据成员信息,当我们创建了多个类的对象时,使对象1调用该类的成员函数,为什么可以改变对象1中的信息,而不去设置其他对象的信息?成员函数在类中只有一份,所有该类的对象共同使用,编译器是如何识别并处理的呢?编译器识别一个类分为三步:1.识别类的类名2.识别类的成员变量3.识别类的成员函数并对成员函数进行修改修改方式:成员函数有一个隐藏…

    2022年5月16日
    51
  • Python获取时间戳—学习笔记

    Python获取时间戳—学习笔记time模块importtimetime_str=time.strftime(‘%Y%m%d%H%M%S’)datetime模块importdatetimetime_str=datetime.datetime.now().strftime(‘%Y%m%d%H%M%S’)参考资料Python3学习笔记(十五):常用时间模块time和datetime…

    2022年9月28日
    1
  • 如何打开sln文件并显示窗口_在.sln文件中设置Visual Studio默认启动项目的简单方法…[通俗易懂]

    如何打开sln文件并显示窗口_在.sln文件中设置Visual Studio默认启动项目的简单方法…[通俗易懂]昨天在一台电脑上用git新签出一个项目进行build,却出现一堆编译错误,而在原先的开发机上build无任何错误。对比分析后发现,开发机上VS的启动项目(startupproject)与这台电脑上的不一样,改为一样后,build立马成功。看来问题与msbuild编译VS项目的顺序有关,而哪个项目作为启动项目会影响到这个编译顺序。要避免这个问题,就要保证git签出的VS解决方案的启动项目是一致的,…

    2022年6月9日
    89

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号