Qt 4.8.5 静态编译小结

Qt 4.8.5 静态编译

各处摘录.总结下.


1.下载qt 的源代码qt-everywhere-opensource-src-4.8.5.zip,解压到路径任意,如d:\qt4


2.删除源码包中bin目录下的syncqt和syncqt.dat文件。如不修改将发生 Perl not found in environment - cannot run syncqt 错误。

如果有perl路径应该不需要这个步骤.(未验证没有perl的话是真的需要这个步骤)


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

QMAKE_CFLAGS=-nologo -Zm200 -Zc: wchar_t-
改为:
QMAKE_CFLAGS =-nologo -Zm200  -Zc:wchar_t    (注意末尾的”-“号区别) 
为了更好的配合vc的whcar_t.

4.搜索整个qmake.conf文件,将-MD,-MDd对应改成-MT,-MTd,以实现在没有VC库的电脑也能运行Qt程序。

libc.lib          libcd.lib       libcmt.lib   libcmtd.lib   msvcrt.lib   msvcrtd.lib
C-Release         C-Debug         /MT          /MTd          /MD          /MDd

/NODEFAULTLIB:"libc.lib" /NODEFAULTLIB:"libcd.lib" /NODEFAULTLIB:"msvcrt.lib" /NODEFAULTLIB:"msvcrtd.lib" /NODEFAULTLIB:"libcmtd.lib" /NODEFAULTLIB:"libcmtd.lib"

-MT 需要在 QMAKE_LCLAGS_RELEASE 后增加
/NODEFAULTLIB:"libc.lib" /NODEFAULTLIB:"msvcrt.lib" /NODEFAULTLIB:"libcd.lib" /NODEFAULTLIB:"libcmtd.lib" /NODEFAULTLIB:"msvcrtd.lib"

-MTd 需要在 QMAKE_LFLAGS_DEBUG 后增加
/NODEFAULTLIB:"libc.lib" /NODEFAULTLIB:"msvcrt.lib" /NODEFAULTLIB:"libcd.lib" /NODEFAULTLIB:"libcmt.lib" /NODEFAULTLIB:"msvcrtd.lib"

这6个库其实只要用其中一个.不然会有重名冲突.


后记:在你以后的工程中可能需要增加的链接。

QMAKE_LIBS_CORE 中 ws2_32.lib 

QMAKE_LIBS_GUI 中 imm32.lib winmm.lib 


5.VS命令行窗口下进入刚才解压路径如d:\qt4,使用如下命令生成makefile

configure -opensource -confirm-license -release -static -fast -platform win32-msvc2010 -no-qt3support -script -scripttools -qt-zlib -qt-libpng -qt-libmng -qt-libtiff -qt-libjpeg -qt-sql-sqlite -plugin-sql-sqlite -qt-style-windows -qt-style-windowsxp -qt-style-windowsvista -qt-style-plastique -qt-style-cleanlooks -qt-style-motif -qt-style-cde -nomake demos -nomake examples -nomake docs -mp

静态库其实没必要使用-debug 需要的话使用动态debug库代替.

-debug-and-release -static表示静态编译debug与release版本Qt.-mp表示多核同时编译。

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


6. VS命令行窗口下 输入nmake, 开始编译过程,此过程依机器CPU水平决定时间多少,一般耗时约2hrs。如无错误提示即实现了静态编译 

   也可以使用Jom来加速编译.(不知道编译会不会有不同.) jom -j n


7.清理临时文件

这一步很重要,关系到是否能用qt-vs-addin。(据我测试4.8.5并无影响。)

目录下.qmake.cacheconfigure.cache这保存着你编译时的配置。

tmp子目录
lib子目录中的dll
运行QT助手,待更新索引后,删除doc\html和doc\src目录(如果不需要src的话)
清理编译生成的临时文件
del /s *.obj *.ilk *.exp *.pch *.cdf *.cache *.resources *.tlb *.tli *.tlh *.tmp  *.rsp *.pgc *.pgd *.meta *.tlog *.manifest *.res *.idb *.rep *.xdc *_manifest.rc  *.bsc *.sbr *.metagen *.bi 
 
8.在编译QT时,环境变量中只能存在一个QT目录,否则可能编译时出错。
 
9.在使用静态Qt库的时候可能出现错误( QtGui.lib(qwininputcontext_win.obj) : error LNK2019
只要在工程的属性->Linker->Input->Additional Dependencies里,加入“imm32.lib;winmm.lib;Ws2_32.lib;”问题就解决了。地址

当然了,还有的问题就是静态编译的话,那些插件就不能以dll方式提供了。
Qt应用可以自动的识别那些可用的插件,因为插件被存储在标准的插件子目录下面。程序不需要任何代码来找寻和加载插件,因为Qt已经把这个过程内置了。
在开发过程中,插件目录默认为 QTDIR\plugins,并且所有的插件分别存储在不同的子目录中,例如styles,codecs。
如果你想让你的程序使用自定义的(可配置的)插件路径的话,那么请在程序启动时,读取Qsettings配置(其实就是自己定义一个配置)。
程序可以调用QCoreApplication::addLibraryPath()来使你的配置路径生效。(注意,插件类型目录是需要被保留的)。

Qt静态编译提供的插件有:

Plugin name

Type

Description

qtaccessiblecompatwidgets

Accessibility

Accessibility for Qt 3 support widgets

qtaccessiblewidgets

Accessibility

Accessibility for Qt widgets

qdecorationdefault

Decorations (Qt Extended)

Default style

qdecorationwindows

Decorations (Qt Extended)

Windows style

qgif

Image formats

GIF

qjpeg

Image formats

JPEG

qmng

Image formats

MNG

qico

Image formats

ICO

qsvg

Image formats

SVG

qtiff

Image formats

TIFF

qimsw_multi

Input methods (Qt Extended)

Input Method Switcher

qwstslibmousehandler

Mouse drivers (Qt Extended)

tslib mouse

qgfxtransformed

Graphic drivers (Qt Extended)

Transformed screen

qgfxvnc

Graphic drivers (Qt Extended)

VNC

qscreenvfb

Graphic drivers (Qt Extended)

Virtual frame buffer

qsqldb2

SQL driver

IBM DB2

qsqlibase

SQL driver

Borland InterBase

qsqlite

SQL driver

SQLite version 3

qsqlite2

SQL driver

SQLite version 2

qsqlmysql

SQL driver

MySQL

qsqloci

SQL driver

Oracle (OCI)

qsqlodbc

SQL driver

Open Database Connectivity (ODBC)

qsqlpsql

SQL driver

PostgreSQL

qsqltds

SQL driver

Sybase Adaptive Server (TDS)

qcncodecs

Text codecs

Simplified Chinese (People's Republic of China)

qjpcodecs

Text codecs

Japanese

qkrcodecs

Text codecs

Korean

qtwcodecs

Text codecs

Traditional Chinese (Taiwan)



例:qcncodecs 你需要包含静态库,以及通过 Q_IMPRT_PLUGIN导入对应的库文件。

#include
Windows下:
包含 lib
#pragma comment(lib"qcncodecs.lib")

苹果下包含.a文件 libqcncodecs.a

/*或者gcc 编译包含.a*/
-lcncodecs

同时导入插件
Q_IMPORT_PLUGIN(qcncodecs)
 




10.编译完即可使用vs-addin实现Qt程序的编写,且编写好的程序无需任何dlls,只是容量较大,一个简单的程序也需要10+m的空间。这时可使用 UPX 来压缩exe文件,upx压缩一下3.7M+,压缩语句如下:

Usage: upx [-123456789dlthVL] [-qvfk] [-o file] file..

Commands:

    -1     compress faster                -9 compress better

    --best compress best (can be very slow  for big files)

    -d     decompress                      -l list compressed file

    -t     test compressed file              -V display version number

    -h     give  this help                    -L display software license

Options:

    -q     be quiet                          -v be verbose

    -oFILE write output to ` FILE '

    -f     force compression of suspicious files

    --no-color, --mono, --color, --no-progress change look

Backup options:

    -k, --backup        keep backup files

    --no-backup       no backup files [ default ]

Overlay options:

    --overlay=skip    don't compress a file with an overlay

    --overlay=copy    copy any extra data attached to the file [ default ]

    --overlay=strip     strip any extra data attached to the file [dangerous]

Options  for dos/exe:

    --8086              make compressed exe work on any 8086

    --no-reloc       put no relocations in to the exe header

Options  for dos/com:

    --8086              make compressed com work on any 8086

Options  for dos/sys:

    --8086              make compressed sys work on any 8086

Options  for djgpp2/coff:

    --coff              produce COFF output [ default : EXE]

Options  for watcom/le:

    --le             produce LE output [ default : EXE]




 

 

你可能感兴趣的:(Qt 4.8.5 静态编译小结)