C 语言程序的编译过程
这里,我们所说的 C 语言程序的编译过程指的是从 C 语言源代码生成可执行程序(或库)的过程。通常,该过程要经过四个阶段,包括:
- 预处理
- 编译
- 汇编
- 链接
C 语言程序编译过程
举例来说,我们在名为 main.c 的源文件中输入下面一段简单代码,它在 main 函数中立即返回,返回值是用宏定义的 0 值。
如果使用 gcc 编译器,我们可以逐步观察这个示例程序的编译过程。
gcc 用 -E 选项让编译器在预处理阶段结束后立即停止,不再往下执行编译。预处理过程对翻译单元中的代码进行词法和语义分析,其输出是程序在目标机器上的中间表示。
预处理结束后,注释被替换成了空白行,宏定义被替换成了实际值。如果有 #include 预处理指令,该指令后面的头文件会被包含进中间文件。
gcc 的 -S 选项让编译器在编译阶段结束后立即停止,不再往下执行汇编。编译阶段将预处理阶段生成的中间表示翻译为目标机器上的汇编代码。
这里,汇编代码使用的是 AT&T 格式,我们看到寄存器 EAX 中被写入了 0 值,这是因为 main 函数最后的 ret 指令返回时会将寄存器 EAX 中的值作为返回值。
gcc 的 -c 选项在编译或汇编之后立即停止,不再往下执行链接。
这里,gcc 对汇编代码执行汇编生成了名为 main.o 的目标文件。由 file 命令可知,该文件是一个 ELF 格式的可重定位文件,下一步将对这个目标文件执行链接。
不加任何选项时,gcc 对目标文件执行链接,生成可执行文件。
如以上步骤一样,我们用 -o 指定输出文件名称,这里是 m。该文件是一个可执行文件,尽管它不输出任何内容。
需要注意的是,以上步骤只是为了演示 C 语言程序的编译过程。实际上,如果要从示例中的 main.c 生成可执行文件 m,我们只需要一条命令即可。
之所以可以这样写是因为在正常情况下,对 C 源文件调用 gcc 会执行以上所有预处理、编译、汇编以及链接过程,直接生成可执行文件。
使用C语言写一个"Hello, World!" 程序
默认您已搭建好语言的开发运行环境
使用文本编辑器(如Notepad++)创建一个新的源文件,扩展名为.c,并输入如下内容到文件中,将文件保存为 hello.c:
#include <stdio.h>
int main() {
printf(\”Hello, World!\\n\”);
return 0;
}
打开命令提示符(Command Prompt)或者 PowerShell。
切换到保存 hello.c 的目录
输入以下命令来编译程序:
gcc hello.c -o hello
#使用GCC编译器将 hello.c 编译成可执行文件 hello。
编译成功后,输入以下命令来运行程序:hello,输出:Hello, World!
#include <stdio.h> 用于包含标准输入输出库头文件
include告诉编译器在编译之前将 stdio.h 文件的内容包含在程序中
stdio.h 是C标准库的一部分,它包含了许多用于输入和输出的函数
int main() 是C程序的入口。
printf 是一个C标准库中的函数,用于将格式化的输出打印到标准输出设备。
return 0 是 main 函数的返回语句。
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。