【问题标题】:what is libc? what are the functions it includes? how can we get the source code of it?什么是libc?它包括哪些功能?我们怎样才能得到它的源代码呢?
【发布时间】:2013-12-05 09:43:52
【问题描述】:

根据 Wikipedia,有许多基于操作系统和编译器的标准 C 库变体。 参考:http://en.wikipedia.org/wiki/C_standard_library

  1. 但我想了解在单个库中定义了多少在不同头文件中声明的函数(例如:stdio.h、string.h、stdlib.h 等)。所有这些头文件的源代码文件是否相同,或者 stdio.h、string.h 等有不同的库?由于我是编程初学者,我不知道多个源代码文件是否可以生成像可执行文件这样的单个库。如果可能的话,我可以理解 libc 包含所有标准头文件的定义。在哪里可以看到标准 C 库的源代码?

  2. 是静态库还是动态库?如果两个版本都存在于我的环境(OS/IDE)中,当我在源代码中包含任何标准头文件时,哪个版本会被链接。它依赖于IDE吗?但在 gcc 的情况下,程序员不会明确包含 libc。

  3. libc 是标准 C 库的标准名称吗?

  4. 在 Windows 操作系统/环境中是否已经存在?如果存在,它的名称是什么(仅 libc)?

  5. 还有像 libm 这样的标准 C 库吗?

【问题讨论】:

  • 我相信所有这些都可以通过您最喜欢的搜索引擎来回答。 SO 并不渴望取代搜索引擎。我不相信你提出了一个令人信服的理由来提出这个问题,并且它得出的任何答案都留在这里。
  • 请阅读(GNU C 库手册)和(Linux 编程接口),你会得到你想要的。

标签: c standards standard-library libc libm


【解决方案1】:
  1. 一般来说,头文件 (.h) 包含函数和变量的声明。实现文件 (.c) 包含声明函数的实际实现。由于可以将多个实现文件转换并链接到单个库二进制文件中,因此您可以拥有一个具有多个标头的库。许多 C 库实现都是开源的,您可以在其相关项目页面中查看它们的源代码。 GNU libcRedHat newlib 是最突出的。我相信人们会在 cmets 中添加更多内容。

  2. 已定义实现。您可以将相同的源转换为静态或动态库。在您的系统上安装这两个版本的情况并不少见。由于几乎每个可执行文件都需要 libc,因此它通常默认添加到链接器输入中,因此您不必在每个命令行中添加 -lc

  3. 没有。标准 C 库的标准名称是“标准 C 库”。请注意,几乎所有标准库的实现都扩展了具有非标准函数的库。这些仍然是非标准的,即使它们是标准库的一部分。 (我想到了alloca()。)

  4. MSVCRT.dll 之类的,如果我没记错的话。

  5. libm 代表 standard 库的数学部分,默认情况下不会添加到链接器输入中,因为它很少需要。只有 一个 标准 C 库,即 ISO/IEC 9899 语言标准(因此得名)所描述的那个。可以很容易地假定给定系统上存在许多其他库,但只有 ISO/IEC 文档中描述的才是“标准”。

【讨论】:

  • 我有点自豪地链接到PDCLib,这是我曾经启动的一个标准 C 库实现项目,后来转交给了新的维护者 Owen。您可能会对它感兴趣,因为它致力于 a) 提供易于阅读的源代码(GNU libc 和 newlib 无法提供恕我直言),并且 b) 除非绝对必要,否则不会适当地向库添加扩展。因此,它可能不是您实际就业的首选,但对学习可能很有趣。还没有数学,抱歉。
  • 非常感谢 DevSolar。你的回答很有帮助。但这里还有一个问题:在第 2 点中,您提到系统中可以存在两个版本的库,但我的问题是 - 在 gcc 中,如果我调用 printf(),那么 glibc.a 会被链接还是 glibc.so?
  • @Yash:通常libc.so 是默认值,但您可以使用选项-static 调用编译器来编译包含所有内容的可执行文件。有些平台可能支持其中一个但不支持另一个,因此“取决于”是唯一真正正确的答案。 ;)
  • 值得注意的是,Windows 使用的标准 C 库是 MSVCRT.DLL,但现在您使用 MSVC++ 时会链接它。相反,您可以链接到其他一些 DLL,具体取决于编译器的版本:MSVCR70.DLL、MSVCR71.DLL... 但是,如果您使用 MinGW,您将链接到真正的 MSVCRT.DLL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多