什么是libc?它包含哪些函数?我们如何获取它的源代码?

9
根据维基百科,基于操作系统和编译器,标准C库有许多变体。参考链接
  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. 是否有其他标准C库,如libm?


3
我认为你可以通过使用你喜欢的搜索引擎来找到这个问题的答案。SO并不想取代搜索引擎。我不确定你是否有充分的理由让这个问题及其吸引的回答留在这里。 - High Performance Mark
请阅读《GNU C 库手册》和《Linux 编程接口》,你将获得你想要的。 - debug
1个回答

5
  1. 一般而言,头文件(.h)包含了函数和变量的声明。实现文件(.c)则包含了声明函数的具体实现。由于几个实现文件可以编译成单个库二进制文件并链接起来,因此你可以有一个带有多个头文件的库。许多C库实现是开源的,你可以在它们相对应的项目页面上查看它们的源代码。 GNU libc 和 RedHat newlib 是最显著的例子。我相信人们会在评论中添加更多。

  2. 实现定义。你可以将完全相同的源文件翻译为静态库或动态库。在你的系统上安装两个版本都不少见。由于几乎所有可执行文件都需要libc,所以通常默认将其添加到链接器输入中,因此您无需在每个命令行中添加 -lc

  3. 不一定。标准C库的标准名称为 "The Standard C Library"。请注意,标准库的几乎所有实现都使用非标准函数扩展了库。即使它们作为标准库的一部分出现,这些函数仍然是非标准的。(例如alloca())。

  4. 如果我没记错的话,应该是 MSVCRT.dll 或类似的名称。

  5. libm 代表标准库中的数学部分,由于很少使用,因此通常不会默认添加到链接器输入中。只有一个标准C库,即由ISO/IEC 9899语言标准描述的库(因此得名)。虽然许多其他库可以在给定的系统上假定已经存在,但唯有ISO/IEC文件中描述的是"标准"。


我有点自豪地链接到PDCLib,这是一个标准的C库实现项目,我曾经开始并将其移交给了新的维护者Owen。它可能对你很有趣,因为它努力提供a)易于阅读的源代码(在我看来GNU libc和newlib都没有做到),并且b)除非绝对必要,否则不向库添加扩展。因此,它可能不是您实际就业的首选,但对于学习可能会很有趣。抱歉,还没有数学内容。 - DevSolar
非常感谢DevSolar。你的回答非常有帮助。但是我还有一个问题:在第2点中,您提到系统中可以存在库的两个版本,但我的问题是 - 如果我调用printf()则gcc会链接glibc.a还是glibc.so? - Yash
@Yash:通常情况下,libc.so是默认的库文件,但你可以使用编译器选项-static来编译一个包含所有依赖的可执行文件。一些平台可能支持其中一个而不支持另一个,所以“这取决于具体情况”才是真正正确的答案。 ;) - DevSolar
值得注意的是,Windows使用的标准C库是MSVCRT.DLL,但在使用MSVC++时,你需要链接到其他DLL而不是它。具体来说,取决于编译器的版本,你需要链接到不同的DLL,比如MSVCR70.DLL、MSVCR71.DLL等。然而,如果你使用MinGW,你将链接到真正的MSVCRT.DLL。 - rodrigo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接