C运行时库版本兼容性:更新需要重建吗?

时间:2009-09-01 14:14:26

标签: c++ dll recompile

如何构建库(静态库或dll / so),以便它对系统的C运行时库的未来更新不敏感?

7月底,Microsoft updated一堆库,包括C运行时库。我们的应用程序是用MFC / C ++ / VB和一些第三方库组合编写的,包括一些是闭源的。

我一直在忙着重新编译我们所拥有的所有库,但我想知道它是否真的有必要?如果我们链接或加载针对早期版本的C运行时构建的库,会发生什么?

重新编译这些内容时,主应用程序和支持库之间的编译器和链接器设置必须相同?我发现运行时库设置需要相同(我们使用多线程版本/ MD和/ MDd),但我担心其他设置。我实际上将所有设置都放到Visual Studio属性表中,并且我为所有不同的项目使用相同的工作表,但这对第三方库不起作用,而且我认为它有点矫枉过正。

我注意到链接器会针对冲突的库吐出warning,但它建议忽略默认库。这样做是否安全?对于这个问题来说,这似乎是一个非常难看的解决方案。

2 个答案:

答案 0 :(得分:1)

如果您或您的第三方组件静态链接到过时的C库,您就可以了;升级到这些库不会影响您的程序。当然,您不会受益于任何错误修复或性能升级或您有什么。如果重新编译代码以利用新设置,则所有运行时开关必须相同。无论何时或为何编译库,情况总是如此。忽略默认库可能是安全的(多年来我一直这样做没有困难)。

动态链接库是另一个故事。如果你依赖于具有给定dll的特定版本的目标系统,并且它有一些其他不兼容的版本,那么你就搞砸了。此问题的传统解决方案是将所需的所有dll与可执行文件捆绑在一起。微软新的并排组装方式也可能有所帮助,但总是有点难以设置让我烦恼。你可能会有更好的运气。

答案 1 :(得分:1)

如果您将第三方库作为DLL加载,只要

,它们可能依赖于不同于您的可执行文件的运行时版本。
  • 您没有移交依赖于运行时库(如STL类型)
  • 的类型参数
  • 第三方lib能够加载运行时的版本,它已经构建或与运行时静态链接

因此,您不必重新编译DLL。

如果你是静态的  链接到libs,或者如果要移交运行时DLL中定义的类型,可能会遇到一些已经在lib中导入的符号问题,因此很可能需要重新编译它。