分享

mingw编译Qt5正式版[亲测可用]

 quasiceo 2016-12-17

分类: C/C++

每一段文字都是经过这5天以来辛苦测试得来的经验总结,如需转载,请注明出处
建议所用软件均按以下版本,编译过程中不会出现fail,QtCreator可以使用官方版,慎用ShadowBuild

MinGW             tdm-gcc-4.7.1-2.exe(mingw32,里面的各种工具较新)   
Perl                   ActivePerl-5.16.1.1601-MSWin32-x86-296175.msi
ICU                   icu4c-49_1_2-src(需要自行编译)
Python              python-2.7.0.msi(编译webkit时,3.3会出错)
Ruby                 rubyinstaller-1.9.3-p327.exe(编译webkit时需要)

Qt                     qt-everywhere-opensource-src-5.0.0.tar.gz
QtCreator        qt-creator-2.6.1-src.zip 
-------------------------------------------------------------------------------------------------------
Qt5配置编译安装

从控制台进入新的QT安装目录

设置环境变量
  1. set PATH=%PATH%;D:/icu/bin;D:/icu/lib;D:/Python33;D:/Perl/bin;D:/MinGW32/bin;D:/Ruby/bin
  2. set INCLUDE=%INCLUDE%;D:/icu/include
  3. set LIB=%LIB%;D:/icu/lib
配置命令
  1. configure -prefix %CD%\qtbase -opensource -debug-and-release -nomake tests -nomake examples -opengl desktop -no-vcproj -no-iwmmxt -no-cetest
  2. 如果要进行静态编译请加上 -static
  3. --prefix 参数,指定软件安装目录
编译命令

  1. mingw32-make -i -k 2>err.log
  2. 说明:
    -i            忽略错误
    -k            某些目标不能达成时仍然继续进行
    2>err.log    将发生的错误输出到当前目录的err.log文件中
    在进行最后一步之前查看err.log,只要错误不影响正常使用就可以进行最后一步,否则需要进行错误排除,排除之后再次运行上面这个命令
安装
  1. mingw32-make install
后期工作
要正常使用Qt还需要在系统或者编译工具中设置环境变量
  1. PATH            D:/icu/bin;D:/icu/lib

mingw的一些可能用到的参数
-jN  多任务进行

-------------------------------------------------------------------------
QtCreator配置编译安装(需要qmake)

准备:
QtCreator源码路径:D:/Qt/qt-creator-2.6.1-src
QtCreator编译目录:D:/Qt/qt-creator-2.6.1
QtCreator安装目录:D:/Qt/qt-creator

配置环境变量

  1. set PATH=%PATH%;D:/icu/bin;D:/icu/lib;D:/Python;D:/Perl/bin;D:/MinGW32/bin;D:/Ruby/bin
  2. set path=%path%;d:/qt/5.0.0/qtbase/bin
  3. set INCLUDE=%INCLUDE%;D:/icu/include;D:/qt/5.0.0/qtbase/include
  4. set LIB=%LIB%;D:/icu/lib;D:/qt/5.0.0/qtbase/lib
    将源码包解压到源码目录,新建编译目录,从控制台进入编译目录,
设置好Qt环境变量

生成makefile
  1. qmake "QT_PRIVATE_HEADERS= D:/Qt/5.0.0/qtbase/include" D:/Qt/qt-creator-2.6.1-src/qtcreator.pro
编译
  1. mingw32-make -i -k 2>err.log
打开err.log查看错误,如果不是致命错误则进行下一步

  1. 这是其中一个可能发生的错误,原因是Qt5中这个模块declarative已经升级
  2. Project ERROR: Unknown module(s) in QT: declarative
安装
  1. mingw32-make install
安装完毕后,删除掉编译目录里面的src即可(删不删都不影响使用,但是src很大)
QtCreator仍在编译过程中。。。。。。。。。。。。
---------------------------------------------------------------------------------------------------
没有configure.exe的解决方法 【已测有效】
注释掉qtbase\configure.bat中的一行文字
  1. if not exist %QTSRC%\.gitignore goto sconf
前面加上::注释掉 就是修改为
  1. ::if not exist %QTSRC%\.gitignore goto sconf
回到安装目录运行配置命令
---------------------------------------------------------------------------------------------------
必须注意的bug

来源:https://bugs./show_bug.cgi?id=100592
---------------------------------------------------- 在编译过程中,链接QtWebKitWidgetsd5.dll (位于QtWebKit中)的时候可能会出现:
undefined reference to JSC::JSCell::classInfo() const.
这是个致命错误,会导致无法编译无法继续进行
解决方法: Alright, I was able to fix this locally by merging the content of JSDestructibleObject.h (which defines JSCell::classInfo()) into JSObject.h .
-------------------------------------------------------
the input line is too long/输入行太长
解决方法
尽量缩短qt5所在路径,使用TCC LE 13.0代替cmd.exe可以解决问题的一半,另一半需要自己动手写批处理,批处理尽量分几次写,因为批处理大小似乎也有限制。

我是在编译到Qt5WebKitWidgets的时候遇到这个问题的,批处理如下,需要根据实际情况更改文件中的路径,Qt5WebKitWidgets为release部分,Qt5WebKitWidgetsd为debug部分。
---------------------------------------------------------------------------------------------------
编译icu【需要msys】
【转自官方http:///wiki/Compiling-ICU-with-MinGW

使用 MinGW编译ICU

Qt 5 / QtWebkit 需要ICU, which MinGW distributions do not ship.

预编译包

The ICU 项目官方网站 [site.] 为32和64位系统都提供了预编译库下载。但都只是MSVC2010运行环境下的。

按自己的需要进行编译如何编译
  • 打开msys,进入icu源码包路径
  • $ cd icu/source

设置mingw路径,如

  1. $ export PATH=/c/Mingw-builds-32/bin:$PATH
    【这一步,mingw的路径要按实际的改动】

为 MinGW-w64打上补丁:

  1. $ patch -Np3 -i ../changeset_icu_trunk_source_tools_toolutil_pkg_genc.c_31770.diff

运行 configure && build:

  1. $ ./runConfigureICU MinGW --prefix=$PWD/../dist

最后, run make && make install

  1. $ make && make install
使用
将bin, include, lib路径添加到编译环境的环境变量中,比如在cmd.exe下:
  1. C:\> set PATH=%PATH%;C:\icu\dist\bin;C:\icu\dist\lib
  2. C:\> set INCLUDE=%INCLUDE%;C:\icu\dist\include
  3. C:\> set LIB=%LIB%;C:\icu\dist\lib

此时运行Qt的configure.exe,ICU便能够被检测到,and Qt links against the libraries.

关于ICU4C 5.0的bug

gcc 4.7.2/MinGW环境下,ICU4C 有个bug会导致编译失败 : http://bugs./trac/ticket/9728

---------------------------------------------------------------------------------------------------


====================折腾过程 ================================
【以下为个人记录,仅作备忘】 
12月19日digia发布了QT5正式版,遗憾的是没有发现mingw版本,得自己动手。
下载源码   qt-everywhere-opensource-src-5.0.0.tar.gz
进行各种常规配置,包括安装perl,phony
尝试 configure -h 
竟然发现没有configure.exe
倒是在qtbase中找到了源码,限于水平有限,暂时编译不出来
然后经过各种折腾,发现把4.8.3的configure.exe拷贝到base下面可以运行,

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    尽管经过各种修改,通过了configure的阶段(具体过程在此不表),但是在进行mingw32-make的时候会出现找不到qmodule.pri的情况,打开mkspace文件夹,发现只生成了qconfig.pri,看来想用老版本的configure.exe蒙混过关是行不通的,但是以上努力并没有白费,首先是生成了许多应有的文件,什么include,/qtbase/bin下面也有了qmake.exe。经过继续折腾,得到了5.0.0版本的configure.exe,过程如下
----------------------------------------------------------------------------------------------
将4.8.3的configure.exe复制到5.0.0的qtbase下面
将修改过的private文件夹复制到%QTDIR%\qtbase\include\QtCore目录
将修改过的qlibraryinfo.cpp 复制到\qtbase\src\corelib\global覆盖原文件
(修改方法附在后面)

从控制台进入QT5.0.0安装目录
set QTDIR=%CD%
Set path=%path%;D:\Perl\bin;D:\Python33;D:\mingw\bin;

4.8.3需要指定平台,若使用参数方式-platform配置完毕后,会提示%QTDIR%\qtbase\tools\configure\下面缺少qmake.conf,故使用环境变量方式
set QMAKESPEC=D:\Qt\5.0.0\qtbase\mkspecs\win32-g++

配置命令
configure -prefix %CD%\qtbase -opensource -fast


重新运行配置命令
运行结束后,进入
%QTDIR%\qtbase\bin\
应该已经生成了qmake.exe

删除%QTDIR%\qtbase\configure.exe

将%QTDIR%\qtbase\bin\加入到path
Set path=%path%;%QTDIR%\qtbase\bin\;
从控制台进入
%QTDIR%\qtbase\tools\configure\

qmake
出现
D:/5.0.0/qtbase/.qmake.conf:1: Cannot find feature qt_build_config
Project ERROR: Cannot load qmodule.pri!

打开\qtbase\qmake.conf
去掉load(qt_build_config)


qmake
mingw32-make install

运行完毕之后会在\qtbase\下面生成新的configure.exe
备份这个configure.exe
将整个qt5.0.0目录删除,重新解压源码包,将configure.exe拷贝到qtbase中,运行configure进行配置

---------------------------------------------------------------------------------------------------
使用4.8.3版本的configure.exe配置5.0.0之前所需修改的文件:
1、private文件夹:
以4.8.3目录下的configure.exe对5.0.0进行配置的过程中会提示找不到
private/XXXXX.h
解决方法如下:
进入%QTDIR%\qtbase\include\QtCore\5.0.0\QtCore\private
会发现很多头文件,打开任意一个头文件都只有一行
现在要做的是把
../../../../../src/3rdparty/harfbuzz/src/harfbuzz-gpos-private.h"
改为
../../../src/3rdparty/harfbuzz/src/harfbuzz-gpos-private.h"
一共有一百多个,建议使用批处理,修改完毕后备份,待用
(会进行库文件路径设置的可以通过设置include路径达到相同效果,但是我进行了各种设置,始终没有成功)

2、qlibraryinfo.cpp
使用使用4.8.3版本的configure.exe配置5.0.0时还会出现另一个错误
提示D:\Qt\5.0.0\qtbase\src\corelib\global\qlibraryinfo.cpp中
找不到qt_configure_prefix_path_strs定义

而同目录下的qconfig.cpp对这个变量进行了定义,
static const char qt_configure_prefix_path_str       [512 + 12] = "qt_prfxpath=D:\\Qt\\5.0.0\\qtbase";
前者比后者多一个s,不知道是不是写错了,
qconfig.cpp 是自动生成的,所以只能在提示出错的cpp文件中进行修改

打开D:\Qt\5.0.0\qtbase\src\corelib\global\qlibraryinfo.cpp
所有qt_configure_prefix_path_strs
改为qt_configure_prefix_path_str

qt_configure_prefix_path_str[loc] + 12;
改为qt_configure_prefix_path_str+loc + 12;
因为从上下文来看,需要的是一个char* 的指针
修改完毕后备份待用
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
一些问题
配置时如果不加-fast似乎会有点小问题

编译过程中出现乱码: 删除mingw/share/locale目录下的中文语言文件
mingw32-make 时出现 unrecognized command line option \"-fno-keep-inline-dllexport\"  
表示mingw版本太低

提示Cannot find feature qt_build_config
解决方法:set QMAKEFEATURES=D:\Qt\5.0.0\qtbase\mkspecs\features


编译到webkit可能会出现
process_begin: CreateProcess(null,ruby XXXXXX)  failed. make (e=234)
安装ruby并将其加入到path中可解决问题,但是发生问题的源头据说是mingw版本太低(准确说是其中gcc版本太低)
++++++++++++++++++++++++++++++++++++++++++++++++++
添加Icu支持
这个是从readme看来的,暂时不知道有什么用处,从官网下载
解压到任意目录
将其中的include和lib设置到环境变量include和lib中,然后进行configure,qt就可以有mcu支持
+++++++++++++++++++++++++++++++++++++++++++++++++++++
若文中有误,请与我联系,以便及时更正Q289512125

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多