C库是与编译器一起分发还是直接由OS分发?

时间:2011-05-18 06:38:56

标签: c linux compiler-construction solaris

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

但是,使用GCC编译的用户库是否可以与Forte C库一起使用?如果系统中存在两个C库,那么在运行时会调用哪一个?

此外,如果一个应用程序链接到一些用GCC编译的库和一些用Forte编译的库,那么用GCC编译的库会自动链接到GCC C库并且它对Forte的行为也是如此。

6 个答案:

答案 0 :(得分:7)

GCC附带了libgcc,其中包含辅助函数来执行长除法(甚至更简单的事情,例如CPU上没有乘法指令的乘法)。它不需要特定的libc实现。 FreeBSD使用BSD派生的,glibc在Linux上非常流行,而且对于像avr-libc这样的嵌入式系统有特殊的。

系统可以安装许多库(libc和其他),选择它们的规则因操作系统而异。如果你静态链接它完全在编译时确定。如果您动态链接,则会出现版本控制和路径规则。通常,您不能在运行时混合和匹配,因为编译到可执行文件中的库(来自标头)的位。

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

其他答案(还)都没有提及促进编译器和库之间互通的重要特性 - ABI或应用程序二进制接口。在类Unix的机器上,有一个记录良好的ABI,系统上的C编译器都遵循ABI。这允许大量混合'匹配。通常,您使用系统提供的C库,但您可以使用随编译器提供的替换版本,也可以单独创建。通常,您可以使用由一个编译器编译的库和其他编译器编译的程序。

有时,一个编译器使用运行时支持库进行某些操作 - 可能是32位机器上的64位算术例程。如果您使用使用此编译器构建的库作为使用其他编译器构建的程序的一部分,则可能需要链接此库。但是,我很长一段时间没有看到这个问题 - 纯粹的C。

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

答案 3 :(得分:1)

只有少数几个C库是强制性的,因为它们不是独立环境所必需的。它只需要提供标题所需的内容

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

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

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

答案 4 :(得分:1)

复地?那太旧了。

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

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

它(仍)是免费的。

答案 5 :(得分:0)

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

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

我们也可以使用Pascal编写的操作系统(多年前以这种方式使用Mac OS ..)并使用我们最喜欢的C编译器编写库,或者使用ASM编写的操作系统(即使不是全部,也是如此) Windows版本),但我们必须有C库来构建一个exe。