静态模式编译qt 4.8.4--MSVC 2010

我的电脑:win 7 64位

 

安装相关


下载qt 4.8.4的源代码qt-everywhere-opensource-src-4.8.4.zip,解压到路径:
E:\Qt_compl\qt-src-4.8.4
具体下载路径:http://download.qt-project.org/

然后:

由于Qt4.8在VS环境下的一些问题,为了避免编译中途出现,需要修改有:

 

1、(其实这步我没有做,貌似不需要)删除源码包中bin目录下的syncqt和syncqt.dat文件,如你不放心可将其改名或剪切到别的位置。如不修改将发生 Perl not found in environment - cannot run syncqt 错误。

2、修改\mkspecs\win32-msvc2010下的qmake.conf文件,将其中的

QMAKE_CFLAGS=-nologo -Zm200 -Zc:wchar_t-

QMAKE_CFLAGS=-nologo -Zm200 -Zc:wchar_t   (注意末尾的”-“号区别)

如不修改将来如有项目使用wchar_t,qt却编译成wchar_t-,编译会导致连接错误,提示找不到Qwstring

搜索整个文件,将MD,MDd对应改成MT,MTd,以实现在没有VC库的电脑也能运行Qt程序(反正这个我不修改....)。

 

3. 修改E:\Qt_compl\qt-src-4.8.4\src\3rdparty\webkit\Source\WebCore\platform\DefaultLocalizationStrategy.cpp  327行:

“<selection>”
 ---->
\"<selection>\"

然后生成makefile文件:

E:\Qt_compl\qt-src-4.8.4>configure -debug-and-release -fast -static  -qt-sql-sqlite -qt-zlib -declarative -qt-style-windowsvista -qt-libpng -qt-libmng -qt-libtiff -qt-libjpeg  -nomake demos -nomake examples -nomake docs -mp

-debug-and-release -static一定要有,这个是我们编译的目的.-mp表示多核同时编译。

 
注意-qt-sql-sqlite实际上是对sqlite3的支持,所以不要再徒劳的想要支持sqlite3,没有这个-qt-sql-sqlite3这个编译选项的,-qt-sql-sqlite2实际上就是sqlite3之前的一个版本,其实也是不用考虑去支持的。一旦,开启了-qt-sql-sqlite,在E:\Qt_compl\qt-4.8.4\src\sql编译的中间文件里面就可以看到sqlite3.obj这个中间文件的存在了:
静态模式编译qt 4.8.4--MSVC 2010_第1张图片

实际上看E:\Qt_compl\qt-src-4.8.4\src\sql,就可以发现Makefile里面就指定了3rdparty里面的sqlite,也作为编译范围(只看和sqlite3.xxx相关的):

SOURCES       = kernel\qsqlquery.cpp \
		kernel\qsqldatabase.cpp \
		kernel\qsqlfield.cpp \
		kernel\qsqlrecord.cpp \
		kernel\qsqldriver.cpp \
		kernel\qsqldriverplugin.cpp \
		kernel\qsqlerror.cpp \
		kernel\qsqlresult.cpp \
		kernel\qsqlindex.cpp \
		kernel\qsqlcachedresult.cpp \
		drivers\sqlite\qsql_sqlite.cpp \
		..\3rdparty\sqlite\sqlite3.c \


INCPATH       = -I"..\..\include\QtCore" -I"..\..\include" -I"..\..\include\QtSql" -I"tmp\rcc\debug_static" -I"tmp" -I"..\3rdparty\sqlite" -I"..\..\include\ActiveQt" -I"tmp\moc\debug_static" -I"..\..\mkspecs\win32-msvc2010"

tmp\obj\debug_static\sqlite3.obj: ..\3rdparty\sqlite\sqlite3.c ..\..\include\QtCore\qconfig.h \
		..\corelib\global\qconfig.h


然后:

输入nmake, start compiling....

 

开启"-webkit"功能之后,编译的时候非常久,而且,中途出现报错,问题很多,建议不要开启了(现在可以肯定的是,webkit根本不支持static编译,也就是configure指定了static的时候,这个就一定编译失败)::

        cd qwebframe\ && "D:\Program Files\Microsoft Visual Studio 9.0\VC\BIN\nmake.exe" -f Makefile.WebKit

Microsoft (R) Program Maintenance Utility Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

        "D:\Program Files\Microsoft Visual Studio 9.0\VC\BIN\nmake.exe" -f Makefile.WebKit.Debug all

Microsoft (R) Program Maintenance Utility Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

        link /LIBPATH:"e:\Qt_compl\qt-src-4.8.4\lib" /LIBPATH:"e:\Qt_compl\qt-src-4.8.4\lib" /NOLOGO /DYNAMICBASE /NXCOMPAT /
DEBUG /SUBSYSTEM:CONSOLE "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicK
eyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" /MANIFEST /MANIFESTFILE:"tmp\obj\debug_static\tst_qwebfram
e.intermediate.manifest" /OUT:debug\tst_qwebframe.exe @C:\Users\ADMINI~1\AppData\Local\Temp\nm2432.tmp
LINK : fatal error LNK1104: cannot open file '../../WebCore/debug\webcore.lib'
NMAKE : fatal error U1077: '"D:\Program Files\Microsoft Visual Studio 9.0\VC\BIN\link.EXE"' : return code '0x450'

这个错是在编译路径:E:\Qt_compl\qt-src-4.8.4\src\3rdparty\webkit\Source\WebKit\qt\tests\qwebframe的时候出现的,E:\Qt_compl\qt-src-4.8.4\src\3rdparty\webkit\Source\WebKit\qt\tests下面的都是测试的实例,其实可以不编译的。

解决这个问题,我先是尝试修改 qwebframe的makefile,因为他的makefile确实不对,lib链接指向不对,倒退2级目录,应该是4级,也即是:'../../../../WebCore/debug\webcore.lib',但是我修改了之后,又出现链接解析错误。

所以,我只能把这个tests文件夹或者qwebframe文件夹不编译了。

 

解决方案1:

把文件E:\Qt_compl\qt-src-4.8.4\src\3rdparty\webkit\Source\WebKit\qt\tests\Makefile.WebKit里面的下面这段规则里面的“sub-qwebframe-make_default”删除:

make_default: sub-qwebframe-make_default sub-qwebpage-make_default sub-qwebelement-make_default sub-qgraphicswebview-make_default sub-qwebhistoryinterface-make_default sub-qwebview-make_default sub-qwebhistory-make_default sub-qwebinspector-make_default sub-hybridPixmap-make_default sub-qdeclarativewebview-make_default sub-benchmarks-painting-make_default sub-benchmarks-loading-make_default FORCE

 

解决方案2:

把文件E:\Qt_compl\qt-src-4.8.4\src\3rdparty\webkit\Source\Makefile.WebKit里面的下面这段规则里面的"sub-WebKit-qt-tests-make_default-ordered"删除:

 

make_default: sub-JavaScriptCore-JavaScriptCore-pro-make_default-ordered sub-WebCore-make_default-ordered sub-WebKit-qt-QtWebKit-pro-make_default-ordered sub-WebKit-qt-declarative-make_default-ordered sub-WebKit-qt-tests-make_default-ordered FORCE

 

有必要解释一下,makefile如果没有指定为目标,比如直接输入nmake(Unix输入make),那么就会编译第一个伪目标,上面tests文件夹里面的工程编译都是在E:\Qt_compl\qt-src-4.8.4\src\3rdparty\webkit\Source\Makefile.WebKit里面指定的,而qwebframe的最直接上层的makefile对应的就是E:\Qt_compl\qt-src-4.8.4\src\3rdparty\webkit\Source\WebKit\qt\tests\Makefile.WebKit,我上面的两个解决方案都是逃避方案,就是让有问题的这个东西不编译了。那么说道了第一个伪目标,可以打开这两个makefile看看,第一个伪目标都是:

first: make_default

实际上,整个Qt的下属子makefile都是这么个第一个伪目标。所以直接nmake编译的时候就是相当于nmake first,而first依赖于make_default,make_default依赖于后面的一些东西,就是上面的了。对应的,以E:\Qt_compl\qt-src-4.8.4\src\3rdparty\webkit\Source\WebKit\qt\tests\Makefile.WebKit为例子,如果输入nmake all,那么对应的编译规则就是:

all: sub-qwebframe-all sub-qwebpage-all sub-qwebelement-all sub-qgraphicswebview-all sub-qwebhistoryinterface-all sub-qwebview-all sub-qwebhistory-all sub-qwebinspector-all sub-hybridPixmap-all sub-qdeclarativewebview-all sub-benchmarks-painting-all sub-benchmarks-loading-all FORCE

ok了。

 

后面还是有地方会失败,实际上是因为链接错误,有很多cpp文件不会编译,倒是对应的lib文件是空的:

JSDeviceOrientationEvent.obj : warning LNK4221: no public symbols found; archive member will be inaccessible
JSDeviceMotionEvent.obj : warning LNK4221: no public symbols found; archive member will be inaccessible
JSDataTransferItems.obj : warning LNK4221: no public symbols found; archive member will be inaccessible
JSDataTransferItem.obj : warning LNK4221: no public symbols found; archive member will be inaccessible
MathMLElementFactory.obj : warning LNK4221: no public symbols found; archive member will be inaccessible

对应的cpp文件里面会有这种#if :

#if ENABLE(NETSCAPE_PLUGIN_API)

ENABLE宏的实际定义:

#define ENABLE(WTF_FEATURE) (defined ENABLE_##WTF_FEATURE  && ENABLE_##WTF_FEATURE)

对应的宏定义是在Makefile里面指定的,以E:\Qt_compl\qt-src-4.8.4_test\src\3rdparty\webkit\Source\WebCore下面的Makefile为例子:

DEFINES       = -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DNDEBUG -DBUILDING_QT__=1 -DNDEBUG -DQT_ASCII_CAST_WARNINGS -DENABLE_XSLT=0 -DENABLE_WEB_TIMING=0 -DENABLE_JAVASCRIPT_DEBUGGER=1 -DENABLE_DATABASE=1 -DENABLE_EVENTSOURCE=1 -DENABLE_OFFLINE_WEB_APPLICATIONS=1 -DENABLE_DOM_STORAGE=1 -DENABLE_ICONDATABASE=1 -DENABLE_CHANNEL_MESSAGING=1 -DENABLE_DIRECTORY_UPLOAD=0 -DENABLE_FILE_SYSTEM=0 -DENABLE_QUOTA=0 -DENABLE_SQLITE=1 -DENABLE_DASHBOARD_SUPPORT=0 -DENABLE_FILTERS=1 -DENABLE_XPATH=1 -DENABLE_WCSS=0 -DENABLE_SHARED_WORKERS=1 -DENABLE_WORKERS=1 -DENABLE_XHTMLMP=0 -DENABLE_DETAILS=1 -DENABLE_METER_TAG=1 -DENABLE_PROGRESS_TAG=1 -DENABLE_BLOB=1 -DENABLE_NOTIFICATIONS=1 -DENABLE_INPUT_SPEECH=0 -DENABLE_INSPECTOR=1 -DENABLE_3D_RENDERING=1 -DENABLE_WEB_AUDIO=0 -DENABLE_WEBGL=0 -DENABLE_MEDIA_STATISTICS=0 -DENABLE_VIDEO_TRACK=0 -DENABLE_TOUCH_ICON_LOADING=0 -DENABLE_ANIMATION_API=0 -DENABLE_SVG=1 -DENABLE_SVG_FONTS=1 -DENABLE_SVG_FOREIGN_OBJECT=1 -DENABLE_SVG_ANIMATION=1 -DENABLE_SVG_AS_IMAGE=1 -DENABLE_SVG_USE=1 -DENABLE_DATALIST=1 -DENABLE_TILED_BACKING_STORE=1 -DENABLE_NETSCAPE_PLUGIN_API=1 -DENABLE_WEB_SOCKETS=1 -DWTF_USE_QT_BEARER=1 -DENABLE_TOUCH_EVENTS=1 -DENABLE_VIDEO=0 -DSQLITE_CORE -DSQLITE_OMIT_LOAD_EXTENSION -DSQLITE_OMIT_COMPLETE -D_HAS_TR1=0 -DBUILDING_JavaScriptCore -DBUILDING_WTF -DBUILDING_WEBKIT -DQT_MAKEDLL -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT

里面-DENABLE_NETSCAPE_PLUGIN_API=1,不能编译的cpp文件,其对应的if预编译都是false的。这些东西太多了,我也不知道在哪里一次性搞定,受不了,不想研究了,如果谁牛逼点,搞定了,烦请知会一下我哈,谢谢。


结束了么?没有...

我需要使用vs 2010做qt的开发,所以需要从官网下载一个

  • Visual Studio Add-in 1.1.11 for Qt4 

下载路径:http://qt-project.org/downloads,安装就是了,接下来的就是使用vs10 开发之旅了. 

注,Qt的VS插件配置:

但是如果之前安装过这个插件,配合过之前的安装版使用过的话,需要做一些修改,打开vs2010,打开---"菜单栏"--"Qt"---"Qt Options"

 
静态模式编译qt 4.8.4--MSVC 2010_第2张图片
 

把里面的条目删除,再添加静态编译的根目录:

静态模式编译qt 4.8.4--MSVC 2010_第3张图片
 

点击ok,但是配置还没有结束:

再新建一个qt工程:

静态模式编译qt 4.8.4--MSVC 2010_第4张图片

 

如图,我这里叫做qt3,找到属性管理器:

静态模式编译qt 4.8.4--MSVC 2010_第5张图片

 

双击debug和relase里面的Microsoft.Cpp.Win32.user

静态模式编译qt 4.8.4--MSVC 2010_第6张图片
 

修改里面的路径为E:\Qt_compl\qt-src-4.8.4.

至此,一切才算完成了.

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

说一下qt 源代码工程的make及其submak规则:

 

注:下面说的根目录就是qt代码解压后的最上层直接含有代码的目录。

1、在configure的时候,不要指定那些模块nomake即可:
E:\Qt_compl\qt-src-4.8.4>configure -debug-and-release -fast -static
上面的configure配置就会使得所有的模块都可以被编译进来,也就是会给所有模块生成相应的makefile更新文件(因为每个子目录都存在一个原始的Makefile文件,他不是直接用于编译的,而是用于生成一个新的Makefile的)。而且一旦指定了大的模块no make,则该文件夹下面的模块是不会生成在根目录下面的makefile的相应的编译规则和submak规则了,比如:
-nomake demos -nomake examples -nomake docs
就不会给demos examples 以及docs文件夹下面的工程生成直接编译的makefile的规则了,也就是无法用于下面第三步直接用于根目录下面的make规则和submake规则,但是不是说这个子文件就不能make了,依旧可以的,原始的Makefile还是存在的,可以在sub dir下面做nmake,来生成新的Makefile,以E:\Qt_compl\qt-4.8.4\examples\network\http文件夹为例子:

all:
 E:\Qt_compl\qt-4.8.4\bin\qmake E:/Qt_compl/qt-4.8.4/examples\network\http\http.pro  -o Makefile -spec win32-msvc2008
 "$(MAKE)" -$(MAKEFLAGS) -f Makefile
first: all
qmake:
 E:\Qt_compl\qt-4.8.4\bin\qmake E:/Qt_compl/qt-4.8.4/examples\network\http\http.pro  -o Makefile -spec win32-msvc2008

在E:\Qt_compl\qt-4.8.4\examples\network\http下面输入nmake就会生成新的Makefile,然后编译工程的。


2、如果configure之后,直接nmake会让所有的默认的开启的模块都编译
3、可以做submake的,也就是只编译指定的文件夹下面的东西,比如examples文件夹的实例程序,在configure程序生成的根目录下面的makefile里面就有如下一段:

examples\$(MAKEFILE): 
 @$(CHK_DIR_EXISTS) examples\ $(MKDIR) examples\ 
 cd examples\ && $(QMAKE) e:\Qt_compl\qt-src-4.8.4\examples\examples.pro -spec ..\mkspecs\win32-msvc2008 -o $(MAKEFILE)

sub-examples: examples\$(MAKEFILE) FORCE
 @set MAKEFLAGS=$(MAKEFLAGS)
 cd examples\ && $(MAKE) -f $(MAKEFILE)

sub-examples-all: examples\$(MAKEFILE) FORCE
 @set MAKEFLAGS=$(MAKEFLAGS)
 cd examples\ && $(MAKE) -f $(MAKEFILE) all

sub-examples-clean: examples\$(MAKEFILE) FORCE
 @set MAKEFLAGS=$(MAKEFLAGS)
 cd examples\ && $(MAKE) -f $(MAKEFILE) clean

sub-examples-install_subtargets-ordered: examples\$(MAKEFILE) sub-translations-install_subtargets-ordered  FORCE
 @set MAKEFLAGS=$(MAKEFLAGS)
 cd examples\ && $(MAKE) -f $(MAKEFILE) install

这里只保留了一些我关心的submake规则,有submak, submak all,clean install。@set MAKEFLAGS=$(MAKEFLAGS)表示导入全局的flags规则,然后cd到具体的文件夹下面这里是examples,然后执行make 操作,-f指定makefile文件。至于后面的all clean install就要看具体的子目录的makefile的编写的时候的伪目标了,也就是all,clean和install如何编写的。
那么我现在输入:

E:\Qt_compl\qt-src-4.8.4>nmake sub-examples

Microsoft (R) Program Maintenance Utility Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

        cd examples\ && "D:\Program Files\Microsoft Visual Studio 9.0\VC\BIN\nmake.exe" -f Makefile

Microsoft (R) Program Maintenance Utility Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

        cd network\ && "D:\Program Files\Microsoft Visual Studio 9.0\VC\BIN\nmake.exe" -f Makefile

.......后面省略

4、有第三点可以得出另一个结论,只要整体模块比如examples开启了编译,那么就可以进入到子目录做单个文件夹的nmake了:

E:\Qt_compl\qt-src-4.8.4>cd examples/network/qftp

E:\Qt_compl\qt-src-4.8.4\examples\network\qftp>nmake

Microsoft (R) Program Maintenance Utility Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

        "D:\Program Files\Microsoft Visual Studio 9.0\VC\BIN\nmake.exe" -f Makefile.Debug all

Microsoft (R) Program Maintenance Utility Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

        "D:\Program Files\Microsoft Visual Studio 9.0\VC\BIN\nmake.exe" -f Makefile.Release all

Microsoft (R) Program Maintenance Utility Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.


E:\Qt_compl\qt-src-4.8.4\examples\network\qftp>nmake all

Microsoft (R) Program Maintenance Utility Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

        "D:\Program Files\Microsoft Visual Studio 9.0\VC\BIN\nmake.exe" -f Makefile.Debug all

Microsoft (R) Program Maintenance Utility Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

        "D:\Program Files\Microsoft Visual Studio 9.0\VC\BIN\nmake.exe" -f Makefile.Release all

Microsoft (R) Program Maintenance Utility Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.


E:\Qt_compl\qt-src-4.8.4\examples\network\qftp>nmake clean

Microsoft (R) Program Maintenance Utility Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

        "D:\Program Files\Microsoft Visual Studio 9.0\VC\BIN\nmake.exe" -f Makefile.Debug clean

Microsoft (R) Program Maintenance Utility Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

        del tmp\moc\debug_static\moc_ftpwindow.cpp
        del tmp\rcc\debug_static\qrc_ftp.cpp
        del tmp\obj\debug_static\ftpwindow.obj tmp\obj\debug_static\main.obj tmp\obj\debug_static\moc_ftpwindow.obj tmp\obj\d
ebug_static\qrc_ftp.obj
        del tmp\obj\debug_static\qftp.intermediate.manifest debug\qftp.ilk vc*.pdb vc*.idb
        "D:\Program Files\Microsoft Visual Studio 9.0\VC\BIN\nmake.exe" -f Makefile.Release clean

Microsoft (R) Program Maintenance Utility Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

        del tmp\moc\release_static\moc_ftpwindow.cpp
        del tmp\rcc\release_static\qrc_ftp.cpp
        del tmp\obj\release_static\ftpwindow.obj tmp\obj\release_static\main.obj tmp\obj\release_static\moc_ftpwindow.obj tmp
\obj\release_static\qrc_ftp.obj
        del tmp\obj\release_static\qftp.intermediate.manifest
        del "tmp\obj\debug_static\qftp.intermediate.manifest"
Could Not Find E:\Qt_compl\qt-src-4.8.4\examples\network\qftp\tmp\obj\debug_static\qftp.intermediate.manifest
        del qftp.ilk
Could Not Find E:\Qt_compl\qt-src-4.8.4\examples\network\qftp\qftp.ilk
        del vc*.pdb
Could Not Find E:\Qt_compl\qt-src-4.8.4\examples\network\qftp\vc*.pdb
        del vc*.idb
Could Not Find E:\Qt_compl\qt-src-4.8.4\examples\network\qftp\vc*.idb

E:\Qt_compl\qt-src-4.8.4\examples\network\qftp>nmake clean


5、在静态编译的时候,最好是做两个代码文件夹,一个在configure的时候不指定nomake而开启完全编译的makefile,可以完全编译,也可以仅仅用来做submake做我们需要的编译,用来学习(请参考第一点的说明,指定nomake某些文件夹也还是可以生成makefile,编译子文件夹来得到可执行文件的,只是会做一次makefile的重新生成);另一个不编译demos/examples/docs,这样做出来的就是我们需要的一些库和bin文件,用来做开发。

 

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

第三方库支持

要支持mysql需要的操作,先安装好msyql的驱动,包括头文件和lib文件,在configure的时候指定:

 -qt-sql-mysql -I "path to mysql"\include -L "path to mysql"l\lib

同样对于sqlite2,qt也是需要外置的库文件和头文件的支持的,如mysql安装。

对于openssl,也是先安装好,然后在编译的时候指定:

-openssl -I "path to opensll"\include -L "path to opensll"\lib
最后提醒一下,如果没有像上面一样安装过mysql sqlite2 openssl等支持的库和头文件,就在configure里面简单指定 -qt-sql-mysql  -qt-sql-sqlite2 -openssl,都是无法编译成功的!

至于,openssl的使用下面的文章,应该是一个很好的参考:
VS2012 + Qt 4.8.3 + OpenSSL

你可能感兴趣的:(静态模式编译qt 4.8.4--MSVC 2010)