使用gcc编译C语言程序
- C语言程序实现的过程
- gcc命令
- 基础用法
- 常用选项
- 编译和汇编选项:
- 优化选项:
- 调试选项:
- 链接选项:
- 警告选项:
- 实验
- 对于`-o`选项
- 通过gcc命令熟悉C语言程序的执行过程
- 1.预处理
- 2.编译阶段
- 3.汇编阶段
- 4.链接阶段
C语言程序实现的过程
主要分为以下几个阶段:
- 预处理阶段
- 编译阶段
- 汇编阶段
- 链接阶段
- 生成可执行文件
详情请参考C语言入门(一)——C语言程序的执行过程和构造
gcc命令
GCC的全称为GNU Compiler Collection(GNU是一个项目,旨在创建一个完全免费、开源的类Unix操作系统,Compiler 是编译器,Collection 是集合)。gcc是一套由GNU项目开发的编程语言编译器。它支持多种编程语言,包括C、C++、Fortran、Ada、Objective-C等,当然gcc最常使用的情形是编译C语言程序。
基础用法
gcc [选项] 源文件1 [源文件2 ...]
gcc [选项] 源文件1 [源文件2 ...] -o 输出文件名
这里的[选项]和[源文件2…]不是必须的。
-o
选项是默认要加上的。
常用选项
编译和汇编选项:
-E: 只进行预处理,生成预处理后的代码。
-S: 生成汇编代码而不进行后续的编译和链接。
-c: 只编译不链接,生成目标文件。
优化选项:
-O[level]: 设置优化级别(0 到 3)。
-Os: 优化以减小代码大小。
-Og: 适用于优化调试时的代码。
调试选项:
-g: 生成调试信息。
-ggdb: 生成适用于 GDB 的调试信息。
链接选项:
-l<library>: 链接时指定使用的库。
-L<directory>: 添加库文件搜索路径。
-static: 静态链接生成可执行文件。
警告选项:
-Wall: 启用常见的警告。
-Werror: 将警告视为错误。
实验
对于-o
选项
我们以一个最经典的C语言程序为例子,应用gcc对程序进行编译
#include <stdio.h>
int main()
{printf("Hello world!\n");return 0;
}
如果没有-o 输出文件
这段代码,那么默认会输出名为a.out
的可执行文件。
下面的实验关于-E、-S、-c
选项的应用。
通过gcc命令熟悉C语言程序的执行过程
我们如果只想执行代码,使用基础用法中的代码即可,以下主要是为了熟悉C语言的实现过程。
1.预处理
使用-E
选项活动.o
为后缀的文件
使用cat查看test.i的内容后,其实包含了很多的宏的定义,函数的声明等等,最后才是main函数
2.编译阶段
使用-S
选项活动.s
为后缀的汇编程序。
编译阶把高级的C语言转变为较低级的汇编语言,这里的语言就是汇编语言。
3.汇编阶段
使用-c
选项活动.o
为后缀的汇编程序。
因为汇编阶段的程序已经进行了编译,输出的是机器代码,机器代码是二进制代码,如果使用cat进行查看就会出现一堆乱码,所以这里我们使用od命令进行查看。
od -t x1 test.o