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

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

考虑这个场景: 应用程序链接到第 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/

相关文章:

c++ - 由他们的 parent 绘制 QWidgets

c++ - 更改模型后 View 未更新

c# - 从 C# 应用程序调用 C++ dll 时找不到入口点

c - atexit函数在什么场景下使用?

C++:使用<bitset>将未知长度的01字符串转为二进制

c++ - 基类中的私有(private)成员和公共(public)成员有什么区别?

c++ - 获取替代方案

c++ - Visual C++ 自动将 A 或 W 附加到函数末尾

c++ - 找不到 MSVCP80.dll(并排问题?)

visual-studio - 正在加载哪个版本的 C 运行时库 (CRT)?