QT WindowsVS2010平台自行编译SDK的必要性验证

文章原创,转载请注明出处

 

之前一直很迷惑到底需不需要自己把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开发插件中添加上这两个版本

QT WindowsVS2010平台自行编译SDK的必要性验证_第1张图片

然后先用自己编译得到的4.8.0版本对systray项目进行release生成,项目设置为静态运行库。

QT WindowsVS2010平台自行编译SDK的必要性验证_第2张图片

然后打开生成目录

QT WindowsVS2010平台自行编译SDK的必要性验证_第3张图片

打开systray.exe运行之,运行正常,除了没有正确显示图片

QT WindowsVS2010平台自行编译SDK的必要性验证_第4张图片

然后用VS2010的Dependency Walker查看程序的依赖库如下:

QT WindowsVS2010平台自行编译SDK的必要性验证_第5张图片

接下来关闭项目,用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则编译通过

QT WindowsVS2010平台自行编译SDK的必要性验证_第6张图片

但是运行编译生成后的systray.exe却提示如下错误

QT WindowsVS2010平台自行编译SDK的必要性验证_第7张图片

查看程序的依赖库发现确实缺少了这两个动态库

QT WindowsVS2010平台自行编译SDK的必要性验证_第8张图片

必须要将4.8.4 SDK中的这两个库文件拷贝到程序路径才能正常运行

QT WindowsVS2010平台自行编译SDK的必要性验证_第9张图片

由此可以见官方提供的编译后的SDK只是使其不依赖VC 的C运行库,保留了QT对应的动态库的依赖。

你可能感兴趣的:(windows,windows,windows,windows,qt,qt,qt,library,library,平台)