c - C 标准库结构在 macOS 或 Linux 上的编译器和库版本之间是否兼容?

标签 c linux macos gcc clang

我的主机应用程序接管了例如来自动态库的 FILE 对象。即使我的主机应用程序和动态库是使用不同版本的 clang/gcc 编译的,我能否在此对象上安全地调用 fclose()

背景

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

Windows 中情况的图示如下所示:

diagram of library interactions on Windows

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

最佳答案

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

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


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

关于c - C 标准库结构在 macOS 或 Linux 上的编译器和库版本之间是否兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48389080/

相关文章:

c - C 中的嵌套结构和指针

c - 分而治之算法的时间复杂度

c - 将静态函数分离到 C 中的另一个(头文件?)文件中

java - 使用 linux-redhat 的 java 上的内存不足异常

linux - bash 比较变量与字符串

xcode - 如何在 MacOS 上切换命令行工具

c - 二叉搜索树显示 “Preorder” 、 “Inorder” 和 “Postorder”

c# - 编译基于 C# 的 Windows (WinForms App) 应用程序以在 Mac OS High Sierra 或 Mojave 上运行

macos - 如何在我的 MacOSX Yosemite 上安装 Db2 Express C?

linux - 无法在 Ubuntu 中登录或更改密码,传播用户,由 Vertica 安装脚本创建