我的电脑:win 7 64位
然后:
由于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这个中间文件的存在了:实际上看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的开发,所以需要从官网下载一个
下载路径:http://qt-project.org/downloads,安装就是了,接下来的就是使用vs10 开发之旅了.
但是如果之前安装过这个插件,配合过之前的安装版使用过的话,需要做一些修改,打开vs2010,打开---"菜单栏"--"Qt"---"Qt Options"
把里面的条目删除,再添加静态编译的根目录:
点击ok,但是配置还没有结束:
再新建一个qt工程:
如图,我这里叫做qt3,找到属性管理器:
双击debug和relase里面的Microsoft.Cpp.Win32.user
修改里面的路径为E:\Qt_compl\qt-src-4.8.4.
至此,一切才算完成了.
注:下面说的根目录就是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,都是无法编译成功的!