• 14846阅读
  • 28回复

[原创]Qt5.0.0 MSVC2012自编译版(x86_xp及x64) [复制链接]

上一主题 下一主题
离线roywillow
 

只看楼主 倒序阅读 楼主  发表于: 2013-01-11
— 本帖被 XChinux 从 Qt基础编程 移动到本区(2013-01-30) —
以下为本人编译的Qt5.0.0 MSVC2012版(Express with Update 1),与各位分享一下。不过目测Qt5.0.1也快来了吧……

两个版本皆不包括QtWebKit,因为没有准备ICU;OpenSSL也是用了取巧一点的方法,没有实际编译(openssl-1.0.1c),只是将它的头文件放在了编译器可以搜索到的地方,这样Network模块应该启用了OpenSSL支持,只要运行时提供SSL的dll就好;OpenGL为desktop,未启用ANGLE;二者皆通过修改mkspecs来达到优化体积,并且静态链接msvcrt。

尚未在其他的机器上进行测试,但是从Qt4的情况来看,需要自己在qmake.exe同级文件夹中创建一个qt.conf文件,在其中写入
[Paths]
Prefix = 【你的Qt路径】

来替换掉qmake和Qt dll中硬编码进去的我的Qt路径,具体可参考http://qt-project.org/doc/qt-4.8/qt-conf.html 。最后执行qmake.exe -query来确认一下返回的各种路径的的确确对应你的Qt5的位置。

如果下载解压缩完下面的Qt5发现不能用,请务必再确认一遍上面这段的内容。

首先是64位版(未启用XP支持,Windows 7 Ultimate SP1 x64下测试没发现问题
百度网盘 Qt5.0.0-MSVC2012-x64
我的configure参数(我把自己能明白的参数都给加上了,即使是默认开启的)
-prefix "E:\Qt5.0.0-MSVC2012-x64" -release -opensource -c++11 -shared -ltcg -fast -nomake demos -nomake tests -nomake examples -accessibility -opengl desktop -platform win32-msvc2012 -qt-zlib -qt-pcre -no-icu -qt-libpng -qt-libjpeg -qt-freetype -no-angle -no-vcproj -sse2 -sse3 -ssse3 -sse4.1 -sse4.2 -avx -avx2 -openssl -no-qml-debug -native-gestures -mp

同时我也对mkspecs做了修改
QMAKE_CFLAGS_RELEASE中,-O2改为-O1,优化大小;-MD改为-MT,静态链接vcrt;其它条目中的O2和-MD/MDd也都做了修改。
QMAKE_LFLAGS中,/DYNAMICBASE改为/DYNAMICBASE:NO,这东西是为了防止反编译而设计的,关掉可以减少体积,具体参考微软的文档。


之后是32位版(启用了XP支持,Windows 7 XP Mode下测试没发现问题)
百度网盘 Qt5.0.0-MSVC2012-x86
我的configure参数
-prefix "E:\Qt5.0.0-MSVC2012-x86" -release -opensource -c++11 -shared -ltcg -fast -nomake demos -nomake tests -nomake examples -accessibility -opengl desktop -platform win32-msvc2012 -qt-zlib -qt-pcre -no-icu -qt-libpng -qt-libjpeg -qt-freetype -no-angle -no-vcproj -sse2 -sse3 -ssse3 -sse4.1 -sse4.2 -avx -avx2 -openssl -no-qml-debug -native-gestures -mp

对于mkspecs的修改更多一些
对于O1和MT等条目的修改同64位版
另外QMAKE_COMPILER_DEFINES中,添加_USING_V110_SDK71_
QMAKE_LFLAGS_CONSOLE改为/SUBSYSTEM:CONSOLE,5.01
QMAKE_LFLAGS_WINDOWS改为/SUBSYSTEM:WINDOWS,5.01

但是,想编译XP下能跑的程序,还需要额外设置一些环境变量。VC构建时的环境变量都是通过vcvarsall.bat、vcvars32.bat和vcvarsx86_amd64.bat等实现的,QtCreator可以自动探测到他们的存在。因此我又写了那个vc110xp.bat来进行额外的环境变量设置,之后通过以下步骤来让QtCreator意识到vc110xp.bat的存在,这样就可以在Creator中点一下run就能构建了:
1.进入%AppData%\QtProject\qtcreator文件夹
2.打开toolchains.xml(建议先将其备份一份)
3.其中会找到类似这样的数据
<data>
  <variable>ToolChain.0</variable>
  <valuemap type="QVariantMap">
   <value type="QString" key="ProjectExplorer.MsvcToolChain.SupportedAbi">x86-windows-msvc2012-pe-32bit</value>
   <value type="QString" key="ProjectExplorer.MsvcToolChain.VarsBat">E:\VS2012\VC\bin\vcvars32.bat</value>
   <value type="bool" key="ProjectExplorer.ToolChain.Autodetect">true</value>
   <value type="QString" key="ProjectExplorer.ToolChain.DisplayName">Microsoft Visual C++ Compiler 11.0 (x86)</value>
   <value type="QString" key="ProjectExplorer.ToolChain.Id">ProjectExplorer.ToolChain.Msvc:{d7a402b2-081d-449e-b67f-1d602b3f7e29}</value>
  </valuemap>
</data>

4.我们先复制出来这么一个数据块在这段内容的末尾,然后修改:
    “ToolChain.0”中的0为下一个工具链的索引编号;
    “key="ProjectExplorer.MsvcToolChain.SupportedAbi"”这一行确认一下ABI是不是x86-windows-msvc2012-pe-32bit;
    “key="ProjectExplorer.MsvcToolChain.VarsBat"”这一行为vc110xp.bat的绝对路径;
    “key="ProjectExplorer.ToolChain.Autodetect"”这一行为false;
    “key="ProjectExplorer.ToolChain.DisplayName"”这一行自己根据自己的情况进行修改,可以随便改个名字;
    “key="ProjectExplorer.ToolChain.Id"”这一行,目前来看就是个UUID,可以用QUuid::createUuid()来生成;我是随便把这串代码修改了几位,与其他的编译器的ID不冲突,然后没发现问题。我的ID是“d7a402b2-081d-449e-b67f-1d602b3f7e30”
5.找到类似这一块
<data>
  <variable>ToolChain.Count</variable>
  <value type="int">9</value>
</data>

将工具链的数量改为自己实际情况的数量。
6.保存,QtCreator中检查测试一下。
以上QtCreator的配置比较复杂,各位请自行斟酌。

因为这里比较热闹所以就先发这里了,如果老大觉得不合适就请放到安装与发布区吧
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线skykingf

只看该作者 1楼 发表于: 2013-01-11
用vs2012编出来的程序 xp能用不?
离线roywillow

只看该作者 2楼 发表于: 2013-01-12
回 1楼(skykingf) 的帖子
不装update1和进行一些配置的话不能用
不过我也没亲自测试过是不是真的没法在xp上跑
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线oryjuvog
只看该作者 3楼 发表于: 2013-01-18
什么问题
离线roywillow

只看该作者 4楼 发表于: 2013-01-18
回 3楼(oryjuvog) 的帖子
没用过vs
感觉原因很多很难下手……
从头讲讲你这程序怎么来的吧,从Qt的编译/安装开始
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线oryjuvog
只看该作者 5楼 发表于: 2013-01-18
就是下载你编译好的 然后在属性管理器那里 添加好 include 和 lib 的路径
然后就随便写了一个
离线roywillow

只看该作者 6楼 发表于: 2013-01-18
回 5楼(oryjuvog) 的帖子
有没有创建qt.conf,然后在命令行下执行qmake.exe -query,看看返回的那些地址是不是Qt实际存在的位置
另外vs有没有执行qmake呢?我不太清楚vs的构建流程
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线oryjuvog
只看该作者 7楼 发表于: 2013-01-18
回 6楼(roywillow) 的帖子
不明白
离线roywillow

只看该作者 8楼 发表于: 2013-01-18
回 7楼(oryjuvog) 的帖子
那至少先把顶楼第4段看明白……
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线oryjuvog
只看该作者 9楼 发表于: 2013-01-19
qmake.exe -query 以后的确 不是qt实际存在的地址

我也不懂vs 有没有执行qmake
离线roywillow

只看该作者 10楼 发表于: 2013-01-19
回 9楼(oryjuvog) 的帖子
既然不是你的qt的路径,那就自己去写个qt.conf,放在qmake.exe的文件夹里再说
另外qt有vs的add-on,那个应该得装上qt才能更好使吧
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线oryjuvog
只看该作者 11楼 发表于: 2013-01-19
我已经把弄好的 qt.conf 文件放到qmake的同级目录(bin)下了 但是执行qmake -query 还是没变

另外 我已经安装了Add-on 但是 点击 launch Designer 会出现
离线roywillow

只看该作者 12楼 发表于: 2013-01-19
回 11楼(oryjuvog) 的帖子
看一下你的qt.conf的内容
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线oryjuvog
只看该作者 13楼 发表于: 2013-01-19
回 12楼(roywillow) 的帖子
[Paths]
Prefix = D:\Qt\Qt5.0.0-MSVC2012-x86\
离线roywillow

只看该作者 14楼 发表于: 2013-01-19
回 13楼(oryjuvog) 的帖子
似乎是这个斜杠不行呐……
你要么用Prefix = D:\\Qt\\Qt5.0.0-MSVC2012-x86\\
要么用Prefix = D:/Qt/Qt5.0.0-MSVC2012-x86/
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线oryjuvog
只看该作者 15楼 发表于: 2013-01-19
回 14楼(roywillow) 的帖子
两种都试过了 不行
离线roywillow

只看该作者 16楼 发表于: 2013-01-19
回 15楼(oryjuvog) 的帖子
可是……我这里修改了qt.conf没问题,返回的就是修改后的值……无力……
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线oryjuvog
只看该作者 17楼 发表于: 2013-01-19
回 16楼(roywillow) 的帖子
离线oryjuvog
只看该作者 18楼 发表于: 2013-01-19
回 16楼(roywillow) 的帖子
我知道了 如果直接用cmd的话修改有效 如果用vs的Command Prompt的话 修改无效
离线oryjuvog
只看该作者 19楼 发表于: 2013-01-19
但Vs编译的时候还是链接不上  似乎也没见调用什么qmake
离线roywillow

只看该作者 20楼 发表于: 2013-01-19
回 19楼(oryjuvog) 的帖子
随便写了个qt.conf,又在vs2012 express的x86命令提示下用不同的方式执行了一下,发现结果很纠结:
首先是进入命令提示直接完整路径调用qmake.exe(qmake不在环境变量中所以不能直接调用)
E:\VS2012\VC>E:\Qt5.0.0-MSVC2012-x86\bin\qmake.exe -query
QT_SYSROOT:
QT_INSTALL_PREFIX:D:/Qt/Qt5.0.0-MSVC2012-x86/
QT_INSTALL_ARCHDATA:D:/Qt/Qt5.0.0-MSVC2012-x86
QT_INSTALL_DATA:D:/Qt/Qt5.0.0-MSVC2012-x86
……

以上,有效

然后,进入qmake的bin文件夹中,直接执行qmake.exe(不是完整路径)
E:\VS2012\VC>cd E:\Qt5.0.0-MSVC2012-x86\bin

E:\Qt5.0.0-MSVC2012-x86\bin>qmake.exe -query
QT_SYSROOT:
QT_INSTALL_PREFIX:E:/Qt5.0.0-MSVC2012-x86
QT_INSTALL_ARCHDATA:E:/Qt5.0.0-MSVC2012-x86
QT_INSTALL_DATA:E:/Qt5.0.0-MSVC2012-x86
……

以上,无效……?

之后,仍然在bin文件夹中,完整路径执行qmake
E:\Qt5.0.0-MSVC2012-x86\bin>E:\Qt5.0.0-MSVC2012-x86\bin\qmake.exe -query
QT_SYSROOT:
QT_INSTALL_PREFIX:D:/Qt/Qt5.0.0-MSVC2012-x86/
QT_INSTALL_ARCHDATA:D:/Qt/Qt5.0.0-MSVC2012-x86
QT_INSTALL_DATA:D:/Qt/Qt5.0.0-MSVC2012-x86
……

以上,有效!?
最后,把qt/bin放入环境变量中,执行qmake.exe,无效!?
目测这位也是遇到了类似的问题http://qt-project.org/forums/viewthread/18213
至于vs下怎么用qt,还是去搜索一下官方文档吧
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线oryjuvog
只看该作者 21楼 发表于: 2013-01-19
回 20楼(roywillow) 的帖子
嗯 我知道了 这应该是继承linux系统的“特点”  执行当前目录的程序 必须输入 ./文件名 对应windows下就是 .\文件名
但是不能只输入 文件名来执行

呃 官方文档都是英文压力山大
离线realfan

只看该作者 22楼 发表于: 2013-01-19
先收藏了
离线revive139
只看该作者 23楼 发表于: 2013-01-28
楼主。。求科普一个问题0 0    官方版和自编译的区别是在什么地方。。。看好多网友都自编译。。但官方的不是下载即用么0 0 。。。
离线roywillow

只看该作者 24楼 发表于: 2013-01-28
回 23楼(revive139) 的帖子
官方目前只提供了msvc2010 x86版啊,想用msvc2012或者64位版的就只能自己编译了
并且自己编译可以进行模块的精简和体积的精简或者速度的优化之类的,比如我这个就没有icu、angle、webkit,也采用了优化体积而不是优化速度之类的
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线kyleno

只看该作者 25楼 发表于: 2013-01-30
非常感谢  谢谢楼主分享
正在输入...
离线roywillow

只看该作者 26楼 发表于: 2013-01-30
我刚想说要不要把这帖子移走呢……
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线zhaoomeng
只看该作者 27楼 发表于: 2013-01-31
大神,授人以鱼不如授之以渔,求求您把您的编译方法教教我好吗?
离线roywillow

只看该作者 28楼 发表于: 2013-01-31
回 27楼(zhaoomeng) 的帖子
其实上面已经包括编译方法的一些重要步骤了,对mkspecs的修改、configure的参数都在
可以再参考一下别人的编译教程自己领悟
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
快速回复
限100 字节
 
上一个 下一个