主角:GCC (GNU Compiler Collection)
GCC (GNU Compiler Collection) 是 Linux 世界的事实标准,它不仅仅是一个 C 编译器,而是一个强大的编译器套件,支持 C、C++、Objective-C、Fortran、Ada 等多种编程语言。

安装 GCC
在几乎所有主流的 Linux 发行版中,GCC 都是默认安装的或可以轻松通过包管理器安装。
-
基于 Debian/Ubuntu 的系统:
sudo apt update sudo apt install build-essential # 这是最推荐的方式,它会自动安装 gcc, g++, make 等基本编译工具 # 或者单独安装 sudo apt install gcc
-
基于 Red Hat/CentOS/Fedora 的系统:
sudo yum groupinstall "Development Tools" # 同样推荐,安装一整套开发工具 # 或者单独安装 sudo yum install gcc
-
基于 Arch Linux 的系统:
(图片来源网络,侵删)sudo pacman -S base-devel # 或者单独安装 sudo pacman -S gcc
安装完成后,可以通过以下命令检查版本:
gcc --version
GCC 的基本使用
GCC 的编译过程通常分为四个阶段:预处理、编译、汇编、链接。gcc 命令通过不同的选项来控制这个过程。
我们有一个简单的 C 源文件 hello.c:
#include <stdio.h>
int main() {
printf("Hello, Linux C Compiler!\n");
return 0;
}
a. 预处理
处理 #include、#define 等预处理指令,生成 .i 文件。

gcc -E hello.c -o hello.i
-E 选项告诉 GCC 只进行预处理。
b. 编译
将预处理后的代码翻译成汇编代码,生成 .s 文件。
gcc -S hello.i -o hello.s
-S 选项告诉 GCC 在编译后停止,输出汇编代码。
c. 汇编
将汇编代码翻译成机器码,生成目标文件,生成 .o 文件。
gcc -c hello.s -o hello.o
-c 选项告诉 GCC 只编译和汇编,不进行链接。
d. 链接 将一个或多个目标文件与所需的库文件链接起来,生成最终的可执行文件。
gcc hello.o -o hello
这是最常用的一步,也是 gcc 命令在不加任何特殊选项时的默认行为。
e. 一键编译 (最常用)
在实际开发中,我们通常不需要手动分步执行,直接使用 gcc 命令一步到位:
gcc hello.c -o hello
这行命令会自动完成预处理、编译、汇编和链接所有步骤,并生成名为 hello 的可执行文件。
f. 运行程序
./hello
输出:
Hello, Linux C Compiler!
常用 GCC 编译选项
-o <filename>: 指定输出的可执行文件名,如果不指定,默认为a.out。-c: 只编译和汇编,生成目标文件(.o),不进行链接。-g: 生成包含调试信息的可执行文件,可以使用 GDB 等调试器进行调试。-O0/-O1/-O2/-O3: 优化级别。-O0: 不优化(默认),编译速度快,便于调试。-O2: 标准优化,推荐用于发布版本。-O3: 更高级别的优化,但可能会增加代码体积。
-Wall: 显示所有常见的警告信息,这是一个非常好的编程习惯,能帮你发现很多潜在的错误。-std=<standard>: 指定 C 语言标准。gcc -std=c99 hello.c -o hello(使用 C99 标准)gcc -std=c11 hello.c -o hello(使用 C11 标准)gcc -std=c17 hello.c -o hello(使用 C17 标准)gcc -std=c++11 hello.cpp -o hello(编译 C++ 代码)
一个更健壮的编译示例:
gcc -Wall -Wextra -std=c11 -g -O2 hello.c -o hello
这个命令会:
- (
-Wall -Wextra) 显示所有警告,帮助你写出更健壮的代码。 - (
-std=c11) 严格遵循 C11 标准。 - (
-g) 包含调试信息。 - (
-O2) 进行标准优化。
其他 C 编译器
虽然 GCC 是主流,但在某些特定场景下,其他编译器也很有价值。
Clang
Clang 是一个由 Apple 主导开发的 C/C++/Objective-C 编译器,它现在也是 LLVM 项目的一部分,以其快速的编译速度和优秀的错误/警告信息提示而闻名。
-
特点:
- 速度快: 通常比 GCC 编译得更快。
- 诊断信息更友好: 错误和警告信息更清晰,甚至能高亮显示代码中的错误位置。
- 模块化设计: 基于 LLVM 的后端,代码结构清晰。
- 对 C++ 的支持: 在 C++ 标准的遵循和错误提示方面,很多人认为 Clang 更胜一筹。
-
安装:
- Ubuntu/Debian:
sudo apt install clang
- Red Hat/CentOS/Fedora:
sudo yum install clang
- Ubuntu/Debian:
-
使用: Clang 的使用方式与 GCC 非常相似,可以直接替换
gcc命令。clang hello.c -o hello clang --version
ICC (Intel C++ Compiler / Intel oneAPI DPC++/C++ Compiler)
这是 Intel 官方推出的高性能编译器,尤其针对 Intel CPU 进行了深度优化。
-
特点:
- 极致性能: 在科学计算、数值模拟、高性能计算等领域,使用 ICC 编译的程序能获得显著的性能提升。
- 商业软件: 对于非个人使用,它是商业软件,需要付费。
- 开源版本: Intel 也提供免费的社区版,名为 Intel oneAPI DPC++/C++ Compiler,支持多种硬件平台。
-
使用场景: 当你的程序对性能有极致要求,并且主要运行在 Intel 服务器或工作站上时,可以考虑使用 ICC。
其他
- PCC (Portable C Compiler): 一个比较古老、轻量级的 C 编译器,在一些资源极其有限的嵌入式系统或作为
make的依赖检查工具时还能见到。 - TCC (Tiny C Compiler): 一个非常小、非常快的 C 编译器,号称“C 编译器之王”,它支持 C99 标准,可以动态链接库,适合快速编译和教学演示。
总结与选择建议
| 编译器 | 特点 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| GCC | Linux 事实标准 | 功能全面、稳定、开源、社区庞大、支持硬件平台广 | 编译速度相对较慢,警告信息有时不够直观 | 绝大多数 Linux 开发场景的首选,从嵌入式到服务器开发。 |
| Clang | 现代、快速 | 编译速度快、诊断信息优秀、模块化设计 | 在某些老旧或特定硬件平台的支持上可能不如 GCC | macOS 开发、现代 C++ 项目、需要快速迭代和清晰错误提示的场景。 |
| ICC | 极致性能优化 | 针对 Intel CPU 优化,性能顶尖 | 商业软件(需付费),免费版功能受限 | 科学计算、高性能计算、对性能有极致要求的商业软件。 |
| TCC/PCC | 轻量、快速 | 体积小、编译速度极快 | 功能有限,标准支持不完全 | 嵌入式系统、快速脚本式编译、教学演示。 |
给新手的建议:
- 从 GCC 开始:它是行业标准,学习资料最多,社区支持最广,掌握 GCC 的使用是 Linux C 开发的基础。
- 养成好习惯:在编译时始终使用
-Wall -std=c11(或更新的标准) 选项,这会让你受益匪浅。 - 了解 Clang:当你熟悉 GCC 后,可以尝试使用 Clang,体验它更快的编译速度和更友好的错误提示,很多现代项目(如 LLVM、Chromium)都在使用 Clang/LLVM 作为默认编译器。
在 Linux 下进行 C 语言开发,GCC 是你必须掌握的核心工具,而 Clang 是一个强大且值得了解的现代化替代品。
