在macOS或Linux上,C标准库结构是否兼容编译器和库版本?

Hel*_*rld 6 c linux macos gcc clang

我的主机应用程序接管了来自动态库的FILE对象的所有权.fclose()即使我的宿主应用程序和动态库是使用不同版本的clang/gcc编译的,我是否可以安全地调用此对象?

背景

在Windows上(具有不同的VS运行时),这将是非法的,我必须首先fclose()从动态库使用的运行时库中提取函数,因为所有运行时都有自己的池和文件或内存对象的内部结构.

Windows中的情况说明如下所示:

Windows上的库交互图

此限制是否也适用于Linux和macOS?

Ste*_*mit 4

问题不在于您的应用程序和动态库是否是使用不同版本的 clang 和/或 gcc 编译的。问题是最终是否有一个底层 C 库可以操作一种 FILE * 对象并拥有一个兼容的fclose().

至少在 MacOS 和 Linux 下,所有这些问题的答案可能都是“是”。根据我的经验,很难将两个不同的、不兼容的 C 库混合在一起;你必须真正努力。


附录:不过,我想我应该承认我的经验可能已经过时了。根据我的经验,在任何类 Unix 系统上,都只有一个 C 库,通常是/lib/libc.{a,so}. 但我认为“现代”编译器倾向于在特殊位置访问自己的编译器和版本特定的库,这意味着您担心的情况可能会成为问题。在我看来,这种方式是疯狂的,但话又说回来,似乎世界上越来越多的人似乎正在拥抱依赖地狱,而不是试图消除它。

  • @EricPostpischil我理解这个问题,但对我来说,这里的根本问题是这种情况是否可以被视为常态。根据我的经验,它*不是*,这确实意味着编译器和库作者无法利用机会引入您所描述的依赖项。如今,随着“依赖地狱”日益成为常态,这很难说。 (2认同)