静态链接使用不同版本的C运行时库构建的库,好还是坏?

时间:2009-12-09 09:50:10

标签: c++ visual-c++ msvcrt static-linking crt

考虑这种情况: 应用程序链接到第三方库A.

A是使用MSVC 2008构建的,并且是静态链接(即使用/ MT构建)到C运行时库v9.0。

该应用程序是使用MSVC 2005构建的,并且静态链接到A和(使用/ MT)到C运行时库v8.0。

我可以看到这个问题 - 例如,如果在运行时库版本之间的标题中更改了类型。

是否注意保持版本之间的运行时库头兼容,或者是否应始终确保所有静态链接库都链接到相同版本的运行时库?

3 个答案:

答案 0 :(得分:13)

应该不是问题。每个库都链接到自己的运行时,并且大多数独立于进程中的其他库。当库ABI被严格定义时,问题就出现了。如果在一个库中分配任何类型的堆分配对象,通过库边界传递并在另一个库中“释放”,则会出现问题,因为正在使用不同的堆管理器从用于分配的堆管理器中释放块它

任何类型的c-runtime定义的结构,对象或实体都不应该在可能正在使用不同运行时版本的边界上传递: - 例如从一个库获得的FILE *对于不同的库没有任何意义链接到不同的运行时。

只要库API只使用原始类型,并且不尝试在指针中传递free(),或者传递指向内部malloc()内存的指针,他们希望应用程序(或其他库)可以释放()你应该没事。

如果c-runtimes混合在一起,那么FUD容易陷入“任何事情都可能出错”,但你必须记住libs和动态库(.so / .dll / .dylib)传统上是在各种各样的语言:允许用asm,c,c ++,fortran,pascal等编写的代码通过有效的CPU高效二进制接口进行编写。

当C与C链接时为什么会突然发生恐慌?

答案 1 :(得分:3)

这是一个非常糟糕的计划。避免。要么在2005年重新编译库,要么在2008年编译应用程序。

答案 2 :(得分:0)

根本不是一个好主意。您无法控制运行时库所做的假设以及它们如何实现某些类型。这很可能会造成一种不圣洁的混乱。