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 库实现或其源代码库吗?
Clang 没有自带 C 标准库。相反,它“支持多种 C 标准库实现”。
包括 Mac OS 在内的类 Unix 系统都有自己的系统。Windows 没有。在 Windows 上,默认安排要求安装 Microsoft 的 Visual C 库。不过,似乎也可以在 Windows 上使用带有 MinGW 库的 Clang。
事情正在发生变化!- 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 将随之发布。请关注此空间以获取更多文档!
但对于 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。
编译 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 中编译,等等。