C库和编译器一起发布还是直接由操作系统发布?

根据我的理解,C库必须和编译器一起分发。 例如,GCC必须分配它自己的C库,Forte必须分配它自己的C库。 我的理解是正确的吗?

但是,用GCC编译的用户库可以使用Forte C库吗? 如果两个C库都存在于一个系统中,哪一个会在运行时被调用?

另外,如果一个应用程序链接到一些使用GCC编译的库和一些使用Forte编译的库,那么使用GCC编译的库会自动链接到GCC C库,并且对于Forte而言它也会有同样的performance。

GCC带有libgcc,其中包含帮助函数来执行诸如长分区(甚至比较简单的事情,例如在没有乘法指令的情况下CPU上的乘法)。 它不需要特定的libc实现。 FreeBSD使用BSD派生的一个,glibc在Linux上非常受欢迎,并且对于像avr-libc这样的嵌入式系统有特殊的意义。

系统可以安装许多库(libc和其他),并且根据操作系统选择规则。 如果您静态链接,则完全在编译时确定。 如果您动态链接,则会有版本控制和路径规则发挥作用。 一般来说,你不能在运行时混合和匹配,因为库中的位(从头文件)被编译到可执行文件中。

两个编译器的编译产品应该兼容,如果它们都遵循平台的ABI。 这是定义特定的注册和调用约定的目的。

就Solaris而言,你的假设是不正确的。 作为内核与用户之间的接口,标准的C库提供了操作系统。 这意味着你使用的任何C编译器(Forte / studio或gcc),总是使用相同的libc。 在任何情况下,Gnu标准C库(glibc)到Solaris的罕见端口都是相当有限的,可能缺乏太多可用的功能。 http://csclub.uwaterloo.ca/~dtbartle/opensolaris/

没有其他答案(还)提到了促进编译器和库之间交互工作的重要特性 – ABI或应用程序二进制接口。 在类似Unix的机器上,有一个良好记录的ABI,系统上的C编译器都遵循ABI。 这允许大量mix'n'match。 通常情况下,您使用系统提供的C库,但可以使用编译器提供的替换版本,也可以单独创建。 通常情况下,您可以使用一个编译器编译的库与其他编译器编译的程序。

有时,一个编译器使用运行时支持库来进行某些操作 – 可能是32位机器上的64位算术例程。 如果您使用此编译器构建的库作为使用另一个编译器构建的程序的一部分,则可能需要链接此库。 不过,我从来没有把这个问题看成是一个长期的问题 – 用纯C

链接C ++是另一回事。 不同C ++编译器之间的交互程度并不相同,他们不同意类布局(vtables等)的细节以及异常处理是如何完成的等等。 您必须更加努力地创建使用其他人可以使用的一个C ++编译器构建的库。

C语言库中只有很少的东西是强制性的,因为它们不是独立环境所需要的。 它只需要提供标题所需的内容

<float.h>, <iso646.h>, <limits.h>, <stdarg.h>, <stdbool.h>, <stddef.h>, and <stdint.h> 

这些通常不会实现许多必须提供的功能。

另一种类型的环境被称为“托管”环境。 正如名字所示,他们假设有一些实体“托管”正在运行的程序,通常是操作系统。 所以通常C库是由“托管环境”提供的,但正如Ben所说,在不同的系统上甚至可能会有其他的实现。

长处? 这真的很老。

Solaris的首选编译器和开发工具都包含在Oracle Solaris Studio中。 带调试器的C / C ++ / Fortran,基于NetBeans的性能分析器和IDE,以及大量的库。

http://www.oracle.com/technetwork/server-storage/solarisstudio/index.html

它(仍然)是免费的。

我认为对于术语有一点困惑:一个库不是DLL或.so:在真正意义上的编程语言中,库是编译代码,LINKER将与我们的二进制( .o) 合并 。 所以链接器(或通过一些指令的编译器…)可以管理它们,但操作系统不能,只是不是一个有关操作系统的概念。

我们习惯于认为操作系统是用C语言编写的,我们可以用gcc / libraries或类似的语言重建操作系统,但C不是linux / unix。

我们也可以用Pascal编写的操作系统(Mac OS就是用这种方式在很多年以前的版本中)并且使用我们最喜欢的C编译器的库,或者有一个用ASM编写的操作系统(即使不是全部,就像在第一个Windows版本中一样) ,但我们必须有C库来建立一个EXE。