【问题标题】:C libraries are distributed along with compilers or directly by the OS?C 库与编译器一起分发还是直接由操作系统分发?
【发布时间】:2011-05-18 06:38:55
【问题描述】:

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

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

此外,如果应用程序链接到多个库,其中一些使用 GCC 编译,一些使用 Forte 编译,使用 GCC 编译的库是否会自动链接到 GCC C 库,并且对于 Forte 的行为是否相同。

【问题讨论】:

    标签: c linux compiler-construction solaris


    【解决方案1】:

    GCC 带有 libgcc,其中包含辅助函数来执行诸如长除法之类的事情(或者甚至更简单的事情,例如在没有乘法指令的 CPU 上进行乘法运算)。它不需要特定的 libc 实现。 FreeBSD 使用的是 BSD 派生的,glibc 在 Linux 上非常流行,还有一些用于嵌入式系统的特殊的,例如 avr-libc。

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

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

    【讨论】:

    • 也就是说,如果我要下载或购买一个编译器,如果它至少没有附带某种 libc,即使我最终选择了另一个,我也会感到受骗!
    • 正如我所说,GCC 没有“附带”一个 libc。你也不能用它链接程序:它是一个编译器。 构建环境包括编译器、实用程序(例如 gnu binutils)、头文件、库等。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      其他答案(尚未)都没有提到促进编译器和库之间互通的重要功能 - ABI 或应用程序二进制接口。在类 Unix 机器上,有一个有据可查的 ABI,系统上的 C 编译器都遵循 ABI。这允许大量的混合搭配。通常,您使用系统提供的 C 库,但您可以使用编译器提供的替代版本,或者单独创建。通常,您可以将由一个编译器编译的库与其他编译器编译的程序一起使用。

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

      链接 C++ 是另一回事。不同 C++ 编译器之间的互通程度不同——它们在类布局(vtables 等)的细节以及如何完成异常处理等方面存在分歧。您必须更加努力地创建使用一种 C++ 编译器构建的库,以供其他人使用。

      【讨论】:

        【解决方案4】:

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

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

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

        其他类型的环境称为“托管”环境。顾名思义,他们假设有一些实体“托管”正在运行的程序,通常是操作系统。所以通常 C 库是由那个“宿主环境”提供的,但正如 Ben 所说,在不同的系统上甚至可能有替代实现。

        【讨论】:

          【解决方案5】:

          强项?真的很老了。

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

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

          它(仍然)也是免费的。

          【讨论】:

            【解决方案6】:

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

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-07-06
              • 1970-01-01
              • 2012-12-07
              • 1970-01-01
              • 2010-11-27
              • 1970-01-01
              • 1970-01-01
              • 2021-10-28
              相关资源
              最近更新 更多