第1.3章: 编译器
为什么我们需要编译器?
编译器是把人类可读的 C++ 源代码转换成机器指令的工具。 没有编译器,我们的程序就只能停留在文本文件阶段,永远无法被 CPU 执行。
编译器做的工作远不止翻译。它还会把你的程序与系统库、
动态链接库(DLL)以及其他操作系统组件链接起来。这样你的程序才能调用
malloc、printf 或系统 API 之类的函数。
除了链接之外,编译器和工具链还会对平台本身做出假设: 系统调用如何工作、内存如何布局、线程与进程如何管理,以及遵循哪些应用二进制接口(ABI)约定。 这些假设都被固化进生成的二进制文件中。
这就是为什么即使二进制文件格式相同,它们也无法跨操作系统移植。 例如,一个 GNU/Linux 二进制文件无法在 FreeBSD、基于 musl 的系统或 Android 上运行, 尽管它们使用的都是 ELF 二进制。差异在于各系统提供的库、ABI 和平台约定。
安装
你可以直接访问它们的发布页面来安装这些编译器:
这些编译器同样由 fast_io 库的作者构建与维护, 以确保它们与本教程中的示例无缝配合。
在接下来的章节中,我们会先在 第1.4章 讲解如何配置 Clang, 然后在 第1.5章 讲解 GCC。你可以选择其中任意一个编译器使用——两者都受支持。
设置环境变量
下载完成后,你应当设置环境变量,以便你的 shell 能定位到编译器二进制文件:
- PATH:添加编译器的
bin目录,这样gcc或clang等命令才能被找到。 - LD_LIBRARY_PATH:(Linux/BSD/Android 等)添加编译器的库目录,以便动态库能够被解析。
- DYLD_LIBRARY_PATH:(macOS)添加编译器的库目录用于动态链接。
- Windows:只需要
PATH,不需要LD_LIBRARY_PATH。
设置这些变量可确保你的终端能找到编译器可执行文件以及它们所依赖的库。