Qt5.7源码编译为Linux_x86_32位经历总结



  • 在笔记本上安装Ubuntu操作系统,安装完后才发现原本计划安装x86_64版本的Ubuntu16.04,下载的镜像是x86_32位的。想想Linux 32位能管理超过4GB内存,笔记本的硬件也没有闲置,又不想重新安装,于是就将就用。
    安装好Emacs、Open Office、中文字体后,接下来准备下载Qt 5.7。去官网看了一圈,悲剧了,在Linux上只有这么两个版本:X86架构的64位。

    qt-opensource-linux-x64-android-5.7.0.run
    qt-opensource-linux-x64-5.7.0.run

    好吧,官网没有编译好的Linux_x86_32位版,那就只能自己编译喽。在此之前有过在Linux下交叉编译arm_linux版的经验,据此做起来也不难。于是在Qt官网下载了Qt5.7源码,接下来验证Unbuntu16.04安装的GCC版本为5.4.0,足以满足Qt5.7的编译器选择要求。

    ##编译Qt5.7

    第一步:配置 .configure
    有过Linux源码项目编译的同仁对这个再熟悉不过了。

    ./configure -prefix /home/Qt/Qt5.7 -platform linux-g++-32

    把安装目录定在了/home/Qt/Qt5.7目录下,编译平台目标为linux-g++-32。把Qt5.7中的test和example也都一起编译(没有-nomak掉),这样会多耗点时间。根据提示选择了开源版本,之后看到脚本一顿的检查输出:

    Running configuration tests...
    checking for C++11... yes.
    checking for C++14... yes.
    checking for C++1z... yes.
    checking for default C++ standard edition... yes.
    checking for OpenGL... no.
    checking for OpenGL ES 2.0... no.
    checking for xcb... no.
    …… 省略

    没有太在意这些环境检测输出提示(就因为这个大意,害得自己后面不得不再编译一次),直接忽略了这些信息。接下来看到所希望的输出提示:

    Info: creating stash file /home/du/Qt/qt-everywhere-opensource-src-5.7.0/.qmake.stash
    Info: creating super cache file /home/du/Qt/qt-everywhere-opensource-src-5.7.0/.qmake.super

    Qt is now configured for building. Just run 'make'.
    Once everything is built, you must run 'make install'.
    Qt will be installed into /home/Qt/Qt5.7

    Prior to reconfiguration, make sure you remove any leftovers from
    the previous build.
    (在执行make之前请确保已经清除了之前构建遗留的产物,在此可以调用 make clean清除)

    提示先进行"make",之后是"make install"。
    好开始构建:

    xx@xx:~/Qt/qt-everywhere-opensource-src-5.7.0$ make (开始编译Qt5.7)

    (漫漫编译过程,最后来了几个编译错误)

    Project ERROR: Unknown module(s) in QT: quick
    Makefile:42: recipe for target 'sub-qthangman-make_first' failed
    make[3]: *** [sub-qthangman-make_first] Error 3
    make[3]: Leaving directory '/home/du/Qt/qt-everywhere-opensource-src-5.7.0/qtpurchasing/examples/purchasing'
    Makefile:42: recipe for target 'sub-purchasing-make_first' failed
    make[2]: *** [sub-purchasing-make_first] Error 2
    make[2]: Leaving directory '/home/du/Qt/qt-everywhere-opensource-src-5.7.0/qtpurchasing/examples'
    Makefile:69: recipe for target 'sub-examples-make_first' failed
    make[1]: *** [sub-examples-make_first] Error 2
    make[1]: Leaving directory '/home/du/Qt/qt-everywhere-opensource-src-5.7.0/qtpurchasing'
    Makefile:381: recipe for target 'module-qtpurchasing-make_first' failed
    make: *** [module-qtpurchasing-make_first] Error 2

    (观察上面的错误可以发现是源码目录下“/qtpurchasing”这部分的错误,还有quick模块找不到)
    没办法,编译不成功,只能重来。对于quick模块找不到,找了好久的原因,也查了很多资料,后来才知道,quick模块依赖OpenGL。于是回过头来查看在运行./configure时的check结果:

    Running configuration tests...
    checking for C++11... yes.
    checking for C++14... yes.
    checking for C++1z... yes.
    checking for default C++ standard edition... yes.
    checking for OpenGL... no.
    checking for OpenGL ES 2.0... no.
    checking for xcb... no.

    原来当前Ubuntu16.04没有安装OpenGL库,于是先安装OpenGL Desktop版,OpenGL Desktop依赖xcb,于是先安装xcb后安装OpenGL:

    安装xcb库
    $ sudo apt-get install "^libxcb.*" libx11-xcb-dev libglu1-mesa-dev libxrender-dev
    安装OpenGL
    $ sudo apt-get install build-essential
    安装OpenGL Library
    $ sudo apt-get install libgl1-mesa-dev

    接下来重新构建一次Makefile,在开始之前先执行"make clean"进行清除,因为执行./configure后有提示:

    Prior to reconfiguration, make sure you remove any leftovers from
    the previous build.

    所以先清除:

    make clean

    之后:

    这次为了加快编译速度,不编译examples、tests部分,跳过purchasing(编译不过)、virtualkeyboard(用不上),开启OpenGL模块:
    $ ./configure -prefix /home/Qt/Qt5.7 -platform linux-g++-32 -nomake examples -nomake tests -skip purchasing -skip virtualkeyboard -opengl

    (注意输出的这几项){

    OpenGL / OpenVG:
    EGL .................. no
    OpenGL ............... desktop (openGL桌面版)
    OpenVG ............... no
    XCB .................. yes (system library) (xcb库)
    EGL on X ........... no
    GLX ................ yes
    MIT-SHM ............ yes
    Xcb-Xlib ........... yes
    Xcursor ............ yes (loaded at runtime)
    Xfixes ............. yes (loaded at runtime)
    Xi2 ................ no
    Xrandr ............. yes (loaded at runtime)
    Xrender ............ yes
    XKB ................ yes
    XShape ............. yes
    XSync .............. yes

    开启make支持的硬件多线程编译,我的Intel CORE i5有4个硬件线程,所以加"-j4"参数启用四线程编译,以提高编译速度:

    $ make -j4
    (等待编译结束,大概70分钟,如果不是启用了-j4四线程编译肯定更慢)
    make[3]: Leaving directory '/home/xx/Qt/qt-src-5.7/qt3d/tools/qgltf'
    make[2]: Leaving directory '/home/xx/Qt/qt-src-5.7/qt3d/tools'
    make[1]: Leaving directory '/home/xx/Qt/qt-src-5.7/qt3d'
    xx@xx:~/Qt/qt-src-5.7$

    安装编译好的Qt5.7

    $ sudo make install (需要权限提升)
    (省略安装信息输出)
    make[1]: Entering directory '/home/xx/Qt/qt-src-5.7/qtwebview'
    Some of the required modules (android|ios|winrt|osx_webview_experimental|qtHaveModule(webengine)) are not available.
    Skipped.
    make[1]: Leaving directory '/home/xx/Qt/qt-src-5.7/qtwebview'
    xx@xx:~/Qt/qt-src-5.7$

    ##配置Qt环境变量
    Qt为了解决在一个系统下的共存多个Qt的版本,设计除了qtchooser这个管理工具,以下介绍使用此工具设置Qt5.7环境变量的方法:
    《我的 qtchooser 配置经历》

    系统: Linux du 4.4.0-36-generic #55-Ubuntu SMP Thu Aug 11 18:00:59 UTC 2016 i686 i686 i686 GNU/Linux

    第一步:
    Unbuntu自己带的 qtchooser 在 /usr/bin 目录下,执行 qtchooser --help 得到如下信息:

    Usage:
      qtchooser { -l | -list-versions | -print-env }
      qtchooser -install [-f] [-local] <name> <path-to-qmake>
      qtchooser -run-tool=<tool name> [-qt=<Qt version>] [program arguments]
      <executable name> [-qt=<Qt version>] [program arguments]
    
    Environment variables accepted:
     QTCHOOSER_RUNTOOL  name of the tool to be run (same as the -run-tool argument)
     QT_SELECT          version of Qt to be run (same as the -qt argument)
    

    /usr/lib/i386-linux-gnu/qtchooser 下的几个软链

     4.conf -> /usr/share/qtchooser/qt4-i386-linux-gnu.conf
     5.conf -> /usr/share/qtchooser/qt5-i386-linux-gnu.conf
     qt4.conf -> /usr/share/qtchooser/qt4-i386-linux-gnu.conf
     qt5.conf -> /usr/share/qtchooser/qt5-i386-linux-gnu.conf
    

    链接到的地方在 /usr/share/qtchooser/下的几个.conf文件,于是模仿着也建立了自己Qt5.7的相关配置:

    1. 在/usr/share/qtchooser/ 目录下调用gedit程序创建 qt5.7-i386-linux-gnu.conf
      du@du:/usr/share/qtchooser$ sudo gedit qt5.7-i386-linux-gnu.conf
      填写内容如下:
      /home/Qt/Qt5.7/bin (我编译的Qt5.7所在bin目录)
      /home/Qt/Qt5.7 (我编译的Qt5.7所在目录)

    2. 在/usr/lib/i386-linux-gnu/qtchooser 创建软链接qt5.7.conf指向 /usr/share/qtchooser/qt5.7-i386-linux-gnu.conf

    第二步: 理清 /usr/bin/qmake 文件与 /usr/bin/qtchooser的关系
    du@du:/usr/bin$ ls -l

    (省略更多的文件项)
    lrwxrwxrwx 1 root root 9 9月 14 23:11 qmake -> qtchooser
    lrwxrwxrwx 1 root root 9 9月 14 23:11 qml -> qtchooser
    (省略更多的文件项)

    可发现 qmake本质上是链接到了 /sur/bin/qtchooser 上

    第三步:
    (配置前)
    du@du:/usr/bin$ qmake
    qmake: could not exec '/usr/lib/i386-linux-gnu/qt4/bin/qmake': No such file or directory

    配置 {
    du@du:/usr/bin$ export QT_SELECT=qt5.7 (仅对当前bash有效,关闭bash需要再次执行此命令,后续将此加入系统环境变量中)
    (注 qt5.7.confg -> /usr/share/qtchooser/qt5.7-i386-linux-gnu.conf)
    }

    (配置后)
    du@du:/usr/share/qtchooser$ qmake -v
    QMake version 3.0
    Using Qt version 5.7.0 in /home/Qt/Qt5.7/lib
    du@du:/usr/share/qtchooser$
    (如果配置正确则会是类似上面出现qmake的版本)

    ##编译QtCreator4.1.0
    有了Qt5.7的库,还得有个IDE。被催啊,QtCreator4.1.0也只有x86_64版的,只好下载官网的源码编译了。对于QtCreator的编译放在下一篇讲。

    #后记
    在群里提问:qt-creator-opensource-linux-x86_64-4.1.0.run 可以在Linux_x86_32位下安装吗?
    群友提供的答案是可以,于是下载尝试安装。验证结果是失败,用file命令查看,这个安装包的目标是x86架构的64位。在此对自己的提问作出回答——不可以安装。


  • 网站研运

    @crazyCpp Linux的64位想要运行32位的软件,可以使用轻量级的虚拟机,lxc,这儿就抛砖引玉,自己以前尝试过,编译还是可以的。



  • 编译过qt5.5 mingw_64bit的版本,不太明白qt官方为何不提供各个版本,还要自己编译。。。



  • 楼主误装了32位的Linux,却帮了我的大忙。我也尝试过编译一次,但是没有成功。以后我也按照你这篇试试。



  • @flowerlove 官方计划5.11提供mingw 64版本。之前好像是担心兼容性吧,但其实没事,我自己编译的版本都商用了,没有任何问题。所以我估计他们还是懒,或者不重视mingw,毕竟msvc才是嫡出(官方的QtCreator就是msvc编译的,因为这样性能更好)。



  • 我看了MinGW的历史,知道这个东西暂时没有商业实体支撑,所以使用可能会有些问题。


 

最近的回复

  • 0_1539655233041_329385492.jpg
    各位大家好哦。
    经过一个晚上对论坛的维护更新,我们成功地将论坛更新到最新的版本。这次的版本更新主要是提升了稳定性,因此功能上和原来的一样,请大家放心,不会出现奇怪的东西什么的啦。然后呢,由于提升了稳定性,因此论坛不会莫名其妙地出现未响应的情况,总之比以前好就对啦。

    此外,论坛新增了自己研制的一个分享的插件:nodebb-plugin-share-sns-cn。这个插件呢,主要是做主流社交网站的分享的。目前暂时支持QQ、微博以及微信的分享。目前初版是1.0。

    希望大家常常来论坛玩~

    阅读更多
  • 发一些二次元妹子图吧。谁叫我有时候也挺无聊的呢~
    0_1539486167719_119.jpg

    阅读更多
  • 0_1539445819168_123.jpg
    各位大家好!
    又有一段时间啦。我们的萌梦动作编辑器又进行更新啦!☺ ☺
    这次的更新呢,主要是完善了一下自动构建系统。也就是说为了持续构建并且能够给到爱好者可用并且稳定的软件,我们做了很多的努力,其中一点就是制作了脚本进行持续构建,以前要花很多很多的时间对动作编辑器进行构建,现在呢,没有那么复杂了。简简单单地数个批处理操作,即可快速构建咱们的动作编辑器,使得从代码到产品只需要十几分钟即可完成,比以前的速度节省了90%的时间,可谓神速!这套系统已经成功地应用到Windows平台线上了,现在基本可以做到每日构建的水平。而且为每次构建专门准备了pdb文件,即一旦用户运行动作编辑器出现了问题,可以通过程序调试数据库定位到问题的位置,从而提升服务的水平,想想这对于我一直坚持的萌梦这款产品来说算是革命性的操作呢。

    当然现在这套系统只能应用在Windows线上,Mac OS X这条线是我接下来努力的方向,也希望能够实现Mac这条线的每日构建效果。然后Linux平台也比较重要,想起Linux开发应该比Windows等等要方便,所以我想难度比Windows的要小很多,甚至比Mac OS X的都要小。总之路途还很遥远,加油努力吧!

    这次的Windows版本已经成功地在Windows的安装包中进行测试,同时提供在线的和离线的安装包。下面就是这些安装包的github下载地址。

    Windows在线安装包
    Windows离线安装包

    阅读更多
  • 手动给一个赞!!☺ 🤗
    0_1539264026793_好美的图啊.jpg

    阅读更多

关注我们

微博
QQ群











召唤伊斯特瓦尔