之前一直很迷惑到底需不需要自己把QTSDK 编译一下以便得到静态编译的版本,于是将自行编译的SDK和官方提供的VS2010下编译好的进行了一下对比,发现确实如果要得到彻底静态发布的版本,要自行编译一下SDK。
这里以QT SDK目录中Sapmle中的systray项目为例。
使用了VS插件1.1.10
http://releases.qt-project.org/vsaddin/qt-vs-addin-1.1.10-opensource.exe
首先安装了4.8.4的官方window VS2010 SDK版本
http://qt-project.org/downloads
http://releases.qt-project.org/qt4/source/qt-win-opensource-4.8.4-vs2010.exe
然后又自行编译了4.8.0版本,
http://download.qt.nokia.com/qt/source/qt-everywhere-opensource-src-4.8.0.zip
编译方法参考http://www.cnblogs.com/elect-fans/archive/2012/03/29/2422816.html
然后在VS2010 QT开发插件中添加上这两个版本
然后先用自己编译得到的4.8.0版本对systray项目进行release生成,项目设置为静态运行库。
然后打开生成目录
打开systray.exe运行之,运行正常,除了没有正确显示图片
然后用VS2010的Dependency Walker查看程序的依赖库如下:
接下来关闭项目,用4.8.4版本的QT打开并进行同样设置,生成对应的release程序,结果生成失败:
1>msvcrt.lib(ti_inst.obj): error LNK2005: "private: __thiscall type_info::type_info(class type_infoconst &)" (??0type_info@@AAE@ABV0@@Z) 已经在 LIBCMT.lib(typinfo.obj) 中定义
1>msvcrt.lib(ti_inst.obj): error LNK2005: "private: class type_info & __thiscall type_info::operator=(classtype_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) 已经在 LIBCMT.lib(typinfo.obj) 中定义
1>LIBCMT.lib(crt0init.obj): warning LNK4098: 默认库“msvcrt.lib”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
1>release\\systray.exe: fatal error LNK1169: 找到一个或多个多重定义的符号
通过在项目属性-配置属性-链接器-输入-忽略特定的库:msvcrt.lib则编译通过
但是运行编译生成后的systray.exe却提示如下错误
查看程序的依赖库发现确实缺少了这两个动态库
必须要将4.8.4 SDK中的这两个库文件拷贝到程序路径才能正常运行
由此可以见官方提供的编译后的SDK只是使其不依赖VC 的C运行库,保留了QT对应的动态库的依赖。