新建了一个最简单的qt应用程序工程qttest,没有额外添加任何代码,使用qt静态库,设置静态连接开关,release
编译参数如下
/O2 /GL /I ".\GeneratedFiles" /I "C:\Qt\4.3.3static\include" /I ".\GeneratedFiles\Release" /I "C:\Qt\4.3.3static\include\QtCore" /I "C:\Qt\4.3.3static\include\QtGui" /D "UNICODE" /D "WIN32" /D "QT_THREAD_SUPPORT" /D "QT_NO_DEBUG" /D "NDEBUG" /D "QT_CORE_LIB" /D "QT_GUI_LIB" /FD /EHsc /MT /Zc:wchar_t- /Fo"Release\\" /Fd"Release\vc80.pdb" /nologo /c /Wp64 /Zi /TP /errorReport:prompt
链接参数如下
/OUT:"D:\qttest\Release\qttest.exe" /NOLOGO /LIBPATH:"C:\Qt\4.3.3static\lib" /MANIFEST /MANIFESTFILE:"Release\qttest.exe.intermediate.manifest" /SUBSYSTEM:WINDOWS /ERRORREPORT:PROMPT msvcrt.lib libcmt.lib qtmain.lib QtCore.lib QtGui.lib imm32.lib winmm.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
用depends查看依赖库,如图所视,除了windows自身的库文件,还有一个msvcr80.dll,虽然已经使用了静态连接开关,但是这个文件在发布时一定要随可执行文件一起(私有并行程序集)。还有尽管使用了嵌入清单文件,而Microsoft.VC80.CRT.manifest也是不可缺少的,所以在发布时至少要有三个文件(qttest.exe, msvcr80.dll和Microsoft.VC80.CRT.manifest),其他qt库因为使用静态连接,不再需要。我现在怀疑的是,qt的静态库依然要依赖msvcr80.dll(当时静态编译qt库的时候使用的是win32-msvc2005),这一点qmake在使用静态编译选项的时候没有把静态库做的彻底。如果你有不同观点,欢迎一起讨论。