考虑这个场景: 应用程序链接到第 3 方库 A。
A 使用 MSVC 2008 构建,并静态链接(即使用/MT 构建)到 C 运行时库 v9.0。
该应用程序是使用 MSVC 2005 构建的,静态链接到 A 和(使用/MT)C 运行时库 v8.0。
我可以看到这方面的问题 - 例如,如果在运行时库版本之间的 header 中更改了类型。
是否注意保持运行时库 header 在版本之间兼容,或者应该始终确保所有静态链接库都链接到同一版本的运行时库?
最佳答案
应该不是问题。每个库都链接到自己的运行时,并且大部分功能独立于流程中的其他库。当库 ABI 定义错误时,就会出现问题。如果在一个库中分配任何类型的堆分配对象,跨越库边界并在另一个库中“释放”,则会出现问题,因为正在使用不同的堆管理器从用于分配的堆管理器中释放 block
任何类型的 c-runtime 定义的结构、对象或实体都不应跨越可能使用不同运行时版本的边界传递:- 例如,从一个库中获得的 FILE* 对另一个库没有意义链接到不同的运行时。
只要库 API 仅使用原始类型,并且不要尝试 free() 传入指针,或将指针传递到他们希望应用程序(或其他库)释放的内部 malloc() 内存() 你应该没问题。
如果混合使用 c 运行时,很容易相信“任何事情都可能出错”,但您必须记住,库和动态库 (.so/.dll/.dylib) 传统上是在多种语言:允许使用 asm、c、c++、fortran、pascal 等编写的代码通过有效的 CPU 高效二进制接口(interface)进行通信。
为什么 C 正在链接到 C 时突然 panic?
关于c++ - 静态链接到使用不同版本的 C 运行时库构建的库,好还是不好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1872759/