繁体   English   中英

vs2012工具集兼容性

[英]vs2012 toolset compatibility

在我的VS2012中,我有4个可用的工具集:v90,v100,v110和v110_xp。 我用两个项目testlib(静态库)和testexe(控制台应用程序)做了一个简单的测试。 界面只是一个带有签名void test()函数。 结果:

  • testlib(v90),testexe(v90以外的任何东西) - >不链接
  • testlib(v100),testexe(v110或v110_xp) - >确实链接

但是,对我来说,v100和v110会链接起来似乎有些奇怪,所以我试着让场景复杂一点。 现在我的方法如下所示: std::map<std::string, std::string> test(const std::string& arg) 正如所料,testlib(v100)和testexe(v110)没有链接( mismatch detected for '_MSC_VER' )。

但仍然testlib(v110)和testexe(v110_xp)进行链接,结果exe在Windows XP上运行。 这只是偶然的还是支持的情况? 如果这只是偶然的话,那么仅使用v110_xp中可用功能并打破这种兼容性的示例代码将是受欢迎的。 我想知道是否应该将我的库的两个版本部署到我的客户端,或者只是用v110编译的那个版本。

“工具集”这个词在描述v110和v110_xp之间的差异时有点用词不当。 您仍在使用相同的构建工具。 而且你仍然拥有相同版本的CRT。 通过比较在两个版本之间加载的DLL的Debug + Windows + Module列表中看到的内容,可以看到一些东西。 请注意msvcr110.dll的名称和位置。

CRT实际上是由Update 1更新的,它现在支持XP和更新的Windows版本。 这是通过它在运行时动态绑定到后来的winapi函数,使用GetProcAddress(),如果在XP上运行时无法找到它们的话。

不同的是,你有另一个版本的Windows SDK。 最后一个仍然与XP版本7.1兼容。 您将在C:\\ Program Files(x86)\\ Microsoft SDKs \\ Windows \\ v7.1A中找到它。 使用v110工具集构建时,您将使用存储在C:\\ Program Files(x86)\\ Windows Kits \\ 8.0中的SDK包含和库文件

当您在c:\\ program files(x86)\\ msbuild目录中搜索该字符串时,可以看到使用v110_xp时的特定更改:

  • include和lib文件等目录已更改为Windows 7.1 SDK路径
  • 添加了_USING_V110_SDK71_预处理程序符号,在其他任何重要位置都没有使用
  • 链接器的/ SUBSYSTEM选项被更改为仅需要Windows版本5.02,XP版本号。

简而言之,混合使用v110和v110_xp工具集构建的模块不是问题。

官方不支持混合v110_xp可执行文件和v110库。

与Microsoft单独升级此问题后,他们回答了以下问题:

问题1:使用这些库(v110)并使用工具集v110_xp构建的应用程序可以在Windows XP计算机上正常运行吗?

只有使用v110_xp工具集构建的可执行文件才能在Windows XP计算机上正常运行。 因此,如果应用程序需要在Windows XP计算机上正常运行,则需要确保将项目从默认的v110工具集切换到项目属性页中新引入的v110_xp工具集,包括可执行文件和DLL。有任何。

Q2:我们是否需要发布使用工具集v110_xp构建的这些库的另一个版本?

我认为这取决于您在部署应用程序时需要哪种平台。 如果您的部署计划包括Windows XP计算机,则必须发布使用v110_xp工具集构建的新版本的可执行文件/ DLL。 但是,考虑到使用v110_xp工具集构建的相同可执行文件/ DLL也将在Vista及更高版本上运行,我建议您可以保留使用v110_xp工具集构建的单个版本的可执行文件/ DLL,这可以在所有其他平台上运行。 当Windows XP不再在您的部署计划中时,您可以使用v110工具集转换要重建的整个可执行文件/ DLL。 当然,如果你想分别针对Windows XP和其他系统,你可以同时维护两个版本的可执行文件/ DLL,这将是一件好事。

问题3:Microsoft是否支持在Windows XP上使用工具集v110构建的库?

答案是不。 如果要在Windows XP上正确运行应用程序,则需要在v110_xp模式下构建所有内容。

请不要将具有/导出类的DLL与不同版本的Visual Studio混合使用(即使是次要版本差异)。 STL和MFC具有基于模板构建的类(类本身可能不会为用户模板化),这会阻止不同版本之间的链接和/或编译。

一个简单的例子是CString :与MFC的静态和动态链接将具有不同的CString实现。 Unicode和ANSI CString也不同。 另一个例子是STL本身:Debug构建vector与发布构建vector不同。 此外,在STL集合的情况下,编译器设置也将更改容器的大小/实现(如vectorlist )。

因此,最好不要将具有这些类型类的导出类/函数作为参数导入。 甚至不要以不透明的方式传递它们(就像在void-pointer之上)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM