C是一种编译语言。它的源代码可以用程序员选择的任何编辑器以文本文件的形式编写,然后必须编译成机器代码。
C 源文件按照惯例以.c 扩展名命名,我们使用命令“gcc”来编译 C 源文件。(GCC 代表 GNU Compiler Collection,它是由 GNU 项目产生的编译器系统。)
编译四步:预处理、编译、汇编、链接。
接下来介绍下编译中的这四步分别做了什么。
编译四步
1.预处理
预处理是第一步。预处理器通过以下方式遵守以 # 开头的命令(称为指令):
(1) 删除评论
(2) 扩展宏
(3) 扩展包含的文件
如果您包含了诸如#include <stdio.h> 之类的头文件,它将查找stdio.h 文件并将头文件复制到源代码文件中。
预处理器还生成宏代码并将使用#define 定义的符号常量替换为它们的值。
2. 编译
编译是第二步。它获取预处理器的输出并生成汇编语言,一种中间人类可读的语言,特定于目标处理器。
3.汇编
汇编是编译的第三步。汇编器会将汇编代码转换为纯二进制代码或机器代码(零和一)。此代码也称为目标代码。
4.链接
链接是编译的最后一步。链接器将来自多个模块的所有目标代码合并为一个。如果我们使用库中的函数,链接器会将我们的代码与该库函数代码链接。
在静态链接中,链接器将所有使用的库函数复制到可执行文件中。在动态链接中,不会复制代码,只需将库的名称放在二进制文件中即可。
示例
我们将使用“main.c”作为源文件,来介绍编译过程中的输入输出。
#include <stdio.h>
int main(void)
{
printf("Hello, World!\n");
return (0);
}
在 shell 提示符下,输入命令“gcc main.c”并按 Enter。如果编译成功,将再次显示 shell 提示符。如果它没有编译,它将显示错误消息。
vagrant@vagrant-ubuntu-trusty-64:~$ gcc main.c
vagrant@vagrant-ubuntu-trusty-64:~$ ls
a.out main.c
main.c 编译完成后,键入命令“ls”列出您的目录内容,您将看到一个名为 a.out 的可执行文件。要运行该程序,请在 shell 提示符下键入“./a.out”,然后按 Enter。是的,我们看到了正确的输出“Hello, World!” 后跟一个换行符。
vagrant@vagrant-ubuntu-trusty-64:~$ ./a.out
Hello, World!
vagrant@vagrant-ubuntu-trusty-64:~$
如果您不希望将输出文件命名为默认输出文件名 a.out,则可以使用 -o 选项指定不同的输出文件名。
gcc -o <desired_output_filename> <source filename>
让我们看看下面的示例,我们希望将输出文件命名为 main。
vagrant@vagrant-ubuntu-trusty-64:~$ gcc -o main main.c
vagrant@vagrant-ubuntu-trusty-64:~$ ls
main main.c
vagrant@vagrant-ubuntu-trusty-64:~$
要运行主程序,我们在终端中输入“./main”。
vagrant@vagrant-ubuntu-trusty-64:~$ ./main
Hello, World!
vagrant@vagrant-ubuntu-trusty-64:~$
如果对代码进行更改(即对源文件进行任何更改),则需要保存并重新编译。
在某些情况下,C 源文件将无法成功编译。
需要阅读错误消息以获取有关如何修复的线索,修复代码后保存并重新编译。