在linux上,最为受欢迎的 C/CXX 编译器之一就是 gcc 系列了,其使用 GNU 协议开源。
除此之外,还有基于llvm的现代编译器 clang/clang++,它则使用更为宽松的 BSD 协议开源。
关于两者的比较,可以参见这里。
本文将尝试编译一套与 gnu 编译器无关的基于 clang 的工具链。
clang 是用C++写的,其依赖于 C 和 C++ 标准库,C++ ABI 库,以及 stack unwinder(实际上,我们编译其他的c/c++源代码也离不开三种)。
在clang编译器工具链中,我们可以采用 musl, libcxx, libc++abi 和 libunwind 四个库来完成。
其中,libc++, libc++abi 和 libunwind 属于llvm 自己开发的 C++ 运行时(C++ runtime)。
| clang系列编译器 | GNU 编译器 |
---|
C标准库 | musl | glibc |
C++标准库 | libcxx | libstdc++ |
C++ ABI 库 | libc++abi | libgcc(?不确定) |
stack unwinder | libunwind | libgcc |
需要指出的是,使用clang系列编译器时,也可以链接 GUN 的 glibc, libstdc++, libgcc 库,
这里我们为了与GNU无关,则把这个选择直接忽略。
这里插一句libc 和 glibc的区别,
我们在编译程序时,使用ldd命令,可以看到二进制程序的链接库,而且大部分程序都会依赖于 libc。
在linux系统下,系统默认会有一个libc的库,大多数系统里面的这个libc库就是glibc,系统的大多数程序也都依赖于该库。
glibc是C标准库的一个实现,而在较早之前 linux 有自己的C标准库实现,后来改用使用glibc,而自己原先带libc库不再维护。
回到正题,C标准库,除了glibc的实现外,还有另一个开源实现 musl,采用 MIT 协议。
就C++标准库而言,llvm 也有一个实现,叫 libc++。
libc++ is an implementation of the C++ standard library, targeting C++11, C++14 and above.
All of the code in libc++ is dual licensed under the MIT license and the UIUC License (a BSD-like license).