1

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

7 月底,微软更新了一堆库,包括 C 运行时库。我们的应用程序由 MFC/C++/VB 和一些第三方库(包括一些封闭源代码)混合编写而成。

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

重新编译这些东西时,主应用程序和支持库之间的哪些编译器和链接器设置必须相同?我发现运行时库设置需要相同(我们使用多线程版本 /MD 和 /MDd),但我担心其他设置。实际上,我已经将所有设置都提取到了 Visual Studio 属性表中,并且我对我们所有不同的项目都使用了相同的表,但这不适用于 3rd 方库,我认为这太过分了。

我注意到链接器会发出有关冲突库的警告,但它建议忽略默认库。这样做安全吗?这似乎是一个非常丑陋的问题解决方案。

4

2 回答 2

1

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

动态链接库是另一回事。如果您依赖于具有给定 dll 的特定版本的目标系统,而它具有其他不兼容的版本,那么您就完蛋了。这个问题的传统解决方案是将您需要的所有 dll 与可执行文件捆绑在一起。微软新的并排组装的东西可能也能提供帮助,但设置起来总是有点太难让我费心去费心了。你可能会有更好的运气。

于 2009-09-01T15:05:59.723 回答
1

如果您将第 3 方库作为 DLL 加载,它们可能依赖于与可执行文件不同的运行时版本,只要

  • 您没有移交取决于运行时库(如 STL 类型)的类型参数
  • 第 3 方库能够加载运行时的版本,它已经与运行时一起构建或静态链接到运行时

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

如果您静态链接到库或者如果您正在移交运行时 DLL 中定义的类型,您可能会遇到一些符号问题,这些符号已经导入到您的库中,因此很可能您必须重新编译它。

于 2009-09-01T17:26:34.763 回答