c++ - vs2012 工具集兼容性

标签 c++ visual-c++ visual-studio-2012 msvcrt

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

  • teSTLib(v90), testexe(v90 以外的任何东西) -> 不链接
  • teSTLib(v100), testexe(v110 or 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 的调试 + Windows + 模块列表中看到的内容,您可以看到一些内容。记下 msvcr110.dll 的名称和位置。

CRT 实际上是由 Update 1 更新的,它现在支持 XP 和更新的 Windows 版本。这是通过它在运行时使用 GetProcAddress() 动态绑定(bind)到后来的 winapi 函数来实现的,如果在 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 工具集构建的模块不是问题。

关于c++ - vs2012 工具集兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14426198/

相关文章:

c++ - 我在使用 boolean 接受器时遇到问题

c - 关于Visual C++编译器的问题

c++ - 排序具有特定结构的数据包缓冲区

c# - Visual Studio MVC 5 显示错误但编译和运行正常

c# - 使用 asp.net mvc 4 + Entity Framework 将图像保存到数据库

c++ Excel OLE 自动化。设置整个单元格范围的值 'at once'

c++ - 找出 vector 中的所有元素是假还是真 C++ 的最快方法?

c++ - 错误 :no appropriate constructor found, 即使我做了一个,c++

c# - 从 Windows 桌面获取选定文件的列表

visual-studio-2012 - 命令 xcopy ... 在 Visual Studio 中以代码 9009 退出