Clang 使用什么标准 C 库?glibc,它自己的,还是其他的?

hip*_*ail 9 printf glibc libc llvm-clang c-standard-library

我很确定 glibc 是 gcc 的标准 C 库实现的名称。

但对于 LLVM/Clang,我不确定。我已经在谷歌上搜索过它是否带有整个标准 C 库的自己的实现,或者它们是否也使用 glibc。令人惊讶的是,我能找到的只是最近一篇讨论Google 正在考虑为 LLVM 编写新 libc 的文章。但不是那会取代什么。

即使在 LLVM/Clang 源代码库中,我也很有可能只是盲目或愚蠢,但我似乎找不到它。

明确地说,我只对 C 标准库感兴趣,而不是 C++ 标准库。我对研究它们printf对函数族的实现特别感兴趣。

有人可以告诉我在哪里可以找到 Clang 的 libc/标准 C 库实现或其源代码库吗?

hip*_*ail 8

Clang 没有自带 C 标准库。相反,它“支持多种 C 标准库实现”

包括 Mac OS 在内的类 Unix 系统都有自己的系统。Windows 没有。在 Windows 上,默认安排要求安装 Microsoft 的 Visual C 库。不过,似乎也可以在 Windows 上使用带有 MinGW 库的 Clang。

  • 请注意,到 2022 年,这种情况发生了变化,“llvm-libc”项目现在已经成为现实 (2认同)

Sam*_*rks 8

事情正在发生变化!- LLVM 正在开发自己的 libc 实现 https://github.com/llvm/llvm-project/tree/main/libc

他们还没有在几个版本中讨论过它:https://releases.llvm.org/12.0.0/docs/Proposals/LLVMLibC.html

llvm-libc,[是]针对 C17 及更高版本的 C 标准库的实现,作为 LLVM 项目的一部分。llvm-libc 还将提供相关的平台特定扩展。例如,在Linux上它还提供pthreads、librt和其他POSIX扩展库。

我觉得最有趣的部分是:

  • 从一开始就设计和开发以使用 LLVM 工具和测试,例如模糊测试和清理程序支持的测试。

  • 尽可能使用基于源代码的实现而不是汇编。将尝试修复编译器而不是使用汇编语言解决方法。

看起来 LLVM 14 或 15 将随之发布。请关注此空间以获取更多文档!


Emp*_*ian 6

但对于 LLVM/Clang 我不确定

不清楚您是在询问哪个 libcclang本身正在使用(如clang编译器二进制文件),或者您是否在询问由于编译和链接而产生二进制文件正在使用哪个 libc 。clang

无论哪种情况,答案都是:无论您告诉它使用哪个 libc(在 clang 配置时,或在链接最终二进制文件时)。

它可以是 GLIBC、uClibc、Musl、Apple libc 或其他一些 libc。

最终,LLVM-libc 可能已经准备就绪,也可以使用。

更新:

您是说每次安装 Clang 时,用户都必须决定使用 libc 吗?

否:提供了一个合适的默认值——系统 libc,它在 Linux 上通常是 GLIBC(但不总是),在 MacOS 上是 Apple libc。

我已经 10 多年没有接触过 Windows,但我怀疑它MSVCRT.DLL最终会在那里默认使用。

但是最终用户可以通过在编译和链接时使用合适的-I...-L...标志覆盖默认选择。

最终用户还可以通过重新配置和重建来更改默认值clang

  • 您对这些“合适的 -I... 和 -L... 标志”有任何具体说明吗?到目前为止我所看到的一切都只讨论重建编译器以使用选定的 c std 库。 (2认同)

use*_*610 6

编译 C++ 代码时,来自 GNU 的 libstdc++ 或 LLVMlibc++可用作 C++ 标准库。它们是通过分别clang++使用 flag-stdlib=libstdc++或进行编译来设置的-stdlib=libc++。此信息在https://clang.llvm.org/docs/Toolchain.html 中得到了合理的布局。

编译 C 代码时,不能在每次编译时切换 C 标准库。有必要为选定的 C 库构建整个编译器工具链。这意味着要么交叉编译,要么在 Linux 的情况下,在使用所选 C 库的发行版中编译。如果我想用 musl 编译,我会在 Alpine Linux 中编译,等等。