• 18830阅读
  • 12回复

[转载]Windows环境下Qt5静态编译方法(Qt5+MSVC2010) [复制链接]

上一主题 下一主题
离线梦枫鬼才
 
只看楼主 倒序阅读 楼主  发表于: 2012-12-27
— 本帖被 XChinux 设置为精华(2013-07-13) —
首先,先下载Qt5源码。网上很多有关Qt4的静态编译教程都误人子弟,写着直接下载Qt libraries 4.*.* for Windows (VS 2010 * MB),这是严重错误的!!!否则编译出来的库有足足20+G,还有诸多问题。因为这是静态链接动态编译好的库。正确做法是,直接下载源代码并从源码编译。请看这行小字:The source code is available as a zip (270 MB) or a tar.gz (219 MB) or check all installers here.从此下载并编译。
       然后,更改
\qtbase\mkspecs\win32-msvc*\qmake.conf文件,把下面3行
        
QMAKE_CFLAGS_RELEASE    = -O2 -MD

            QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MD -Zi
            QMAKE_CFLAGS_DEBUG      = -Zi -MDd
        改为:
             QMAKE_CFLAGS_RELEASE    = -O2 -MT
            QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MT -Zi
            QMAKE_CFLAGS_DEBUG      = -Zi -MTd
        并保存。
        由于Qt5官方源码包是为动态编译准备的,因此要静态编译,须对源码进行更改并重命名函数,否则会出现重定义错误。
        更改文件及重命名函数如下(注:在下把冲突函数加007,008重命名)

\qtactiveqt\src\activeqt\shared\qaxtypes.h
\qtactiveqt\src\activeqt\control\qaxserverbase.cpp
\qtactiveqt\src\activeqt\container\qaxbase.cpp
\qtactiveqt\src\activeqt\container\qaxwidget.cpp
文件中的 QVariantToVARIANT( 一律替换为 QVariantToVARIANT007(

\qtactiveqt\src\activeqt\shared\qaxtypes.cpp中的 QVariantToVARIANT( 替换为 QVariantToVARIANT008(
#   define QVariantToVARIANT QVariantToVARIANT_server
#   define QVariantToVARIANT QVariantToVARIANT_container
分别替换为:
#   define QVariantToVARIANT008 QVariantToVARIANT_server
#   define QVariantToVARIANT008 QVariantToVARIANT_container

另外还要更改2个API
\qtactiveqt\src\activeqt\control\qaxserverdll.cpp
STDAPI DllGetClassObject(const GUID &clsid, const GUID &iid, void** ppv)
STDAPI DllCanUnloadNow()
分别替换为:
STDAPI DllGetClassObject007(const GUID &clsid, const GUID &iid, void** ppv)
STDAPI DllCanUnloadNow007()

一切就绪后,visual studio 命令提示进入源码文件夹,输入命令:
configure -debug-and-release -fast -static -platform win32-msvc2010 -qt-zlib -qt-libpng -qt-libjpeg -qt-sql-sqlite -plugin-sql-sqlite -qt-style-windows -qt-style-windowsxp -qt-style-windowsvista -nomake demos -nomake examples -nomake docs -opengl desktop -mp
然后nmake,等待编译完成.
进入Qt Creator,点击 工具->选项->Qt 版本->添加->选择 源码文件夹\qtbase\bin\qmake.exe
再配置Kits,一切完成
转自http://user.qzone.qq.com/1181756476/#!app=2&via=QZ.HashRefresh&pos=1356543527
离线adonais

只看该作者 1楼 发表于: 2012-12-27
有没有试过静态编译qtwebkit
离线梦枫鬼才
只看该作者 2楼 发表于: 2012-12-27
那个没试过,QWebkit这种奇葩的东西避之不及
离线roywillow

只看该作者 3楼 发表于: 2012-12-27
回 1楼(adonais) 的帖子
从Qt4.x(x是几我忘了),官方就声明不再为qtwebkit的静态编译提供支持
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线roywillow

只看该作者 4楼 发表于: 2012-12-27
回 2楼(梦枫鬼才) 的帖子
我比较想知道修改那几个函数名称的理由
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线梦枫鬼才
只看该作者 5楼 发表于: 2012-12-27
因为动态编译时,官方是把文件分开编译再用动态链接库进行链接。但是静态编译时,QVariantToVARIANT函数已在其它文件中定义,用visual studio的nmake不加/k参数时会中断编译,而mingw只是跳过编译依赖此文件的代码。另外DllGetClassObject和DllCanUnloadNow也是因为重定义问题。
离线yujincheng08

只看该作者 6楼 发表于: 2012-12-29
qaxtypes.cpp
..\shared\qaxtypes.cpp(566) : error C2660: “QVariantToVARIANT_container”: 函数
不接受 3 个参数
..\shared\qaxtypes.cpp(582) : error C2660: “QVariantToVARIANT_container”: 函数
不接受 3 个参数
NMAKE : fatal error U1077: “"c:\Program Files (x86)\Microsoft Visual Studio 10.
0\VC\BIN\cl.EXE"”: 返回代码“0x2”
Stop.
NMAKE : fatal error U1077: “"c:\Program Files (x86)\Microsoft Visual Studio 10.
0\VC\BIN\nmake.exe"”: 返回代码“0x2”
Stop.
NMAKE : fatal error U1077: “cd”: 返回代码“0x2”
Stop.
NMAKE : fatal error U1077: “cd”: 返回代码“0x2”
Stop.
NMAKE : fatal error U1077: “cd”: 返回代码“0x2”
Stop.
NMAKE : fatal error U1077: “cd”: 返回代码“0x2”
Stop.

什么情况
离线yujincheng08

只看该作者 7楼 发表于: 2012-12-29
引用第6楼yujincheng08于2012-12-29 18:11发表的  :
qaxtypes.cpp
..\shared\qaxtypes.cpp(566) : error C2660: “QVariantToVARIANT_container”: 函数
不接受 3 个参数
..\shared\qaxtypes.cpp(582) : error C2660: “QVariantToVARIANT_container”: 函数
不接受 3 个参数
.......

解决了,自己推的 不知道对不对:
qaxtypes.h处应该是


  1. #ifdef QAX_SERVER
  2. #   define QVariantToVARIANT007Func QVariantToVARIANT_server
  3. #   define VARIANTToQVariantFunc VARIANTToQVariant_server
  4. #else
  5. #   define QVariantToVARIANT007Func QVariantToVARIANT_container
  6. #   define VARIANTToQVariantFunc VARIANTToQVariant_container
  7. #endif
离线hcaihao

只看该作者 8楼 发表于: 2012-12-30
不需要这么麻烦,加上 -nomake examples -nomake tests -nomake tools 就可以了,出错的地方是tools的代码,先禁用即可。

等qt 5.0.1会fix。
离线计划

只看该作者 9楼 发表于: 2012-12-30
先学习一下,有空编译一遍。
好好学习,天天向上。
离线aileenyuxiao

只看该作者 10楼 发表于: 2013-01-15

        link /NOLOGO /DYNAMICBASE /NXCOMPAT /INCREMENTAL:NO /SUBSYSTEM:CONSOLE "
/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' versio
n='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture
='*'" /MANIFEST /MANIFESTFILE:..\..\..\bin\moc.exe.embed.manifest /OUT:..\..\..\
bin\moc.exe @C:\Users\zyd\AppData\Local\Temp\nmED85.tmp
MSVCRT.lib(MSVCR100.dll) : error LNK2005: _malloc already defined in LIBCMT.lib(
malloc.obj)
MSVCRT.lib(MSVCR100.dll) : error LNK2005: _free already defined in LIBCMT.lib(fr
ee.obj)
MSVCRT.lib(MSVCR100.dll) : error LNK2005: _realloc already defined in LIBCMT.lib
(realloc.obj)
MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_in
fo(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) already defined in LIBC
MT.lib(typinfo.obj)
MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall
type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) a
lready defined in LIBCMT.lib(typinfo.obj)
   Creating library ..\..\..\bin\moc.lib and object ..\..\..\bin\moc.exp
LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; us
e /NODEFAULTLIB:library
..\..\..\bin\moc.exe : fatal error LNK1169: one or more multiply defined symbols
found
NMAKE : fatal error U1077: '"D:\Microsoft Visual Studio 10.0\VC\BIN\link.EXE"' :
return code '0x491'
Stop.
NMAKE : fatal error U1077: '"D:\Microsoft Visual Studio 10.0\VC\BIN\nmake.exe"'
: return code '0x2'
Stop.
NMAKE : fatal error U1077: 'cd' : return code '0x2'
Stop.
NMAKE : fatal error U1077: 'cd' : return code '0x2'
Stop.
NMAKE : fatal error U1077: 'cd' : return code '0x2'
Stop.
NMAKE : fatal error U1077: 'cd' : return code '0x2'
Stop.

这是什么情况
离线skykingf

只看该作者 11楼 发表于: 2013-09-23
编译出来的静态库如何在vc2010种使用呢?
离线lzh1104

只看该作者 12楼 发表于: 2013-10-25
引用第10楼aileenyuxiao于2013-01-15 09:25发表的  :
        link /NOLOGO /DYNAMICBASE /NXCOMPAT /INCREMENTAL:NO /SUBSYSTEM:CONSOLE "
/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' versio
n='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture
='*'" /MANIFEST /MANIFESTFILE:..\..\..\bin\moc.exe.embed.manifest /OUT:..\..\..\
.......

这个错误咋么解决
快速回复
限100 字节
 
上一个 下一个