赞
踩
编译是将源代码转换为目标代码的过程。它是在编译器的帮助下完成的。编译器检查源代码是否存在语法或结构错误,如果源代码没有错误,则生成目标代码。
c 编译过程将作为输入的源代码转换为目标代码或机器代码。编译过程可分为预处理、编译、汇编和链接四个步骤。
预处理:
cpp
) 处理以 #
开头的指令,如 #include
、#define
和 #ifdef
。它通过展开宏和包含头文件来准备源代码进行编译。.c
。此源代码首先传递给预处理器,然后预处理器扩展此代码。展开代码后,扩展的代码将传递给编译器。#include <stdio.h>
#define MAX 100
int main() {
printf("Max value: %d\n", MAX);
return 0;
}
.i
(生成的预处理后的源文件)。编译:
gcc
, clang
) 将预处理后的源代码翻译成特定于目标体系结构的汇编语言。mov eax, 42
.s
(生成的汇编代码文件)。汇编:
as
) 将汇编代码转换为可重定位的机器码(目标代码)。.obj
,在 UNIX 中,扩展名是 .o
。如果源文件的名称为 hello.c
,则目标文件的名称将为 hello.obj
。00000000: B8 2A 00 00 00 mov eax, 0x2a
.o
(生成的目标文件)。链接:
ld
) 将多个目标文件组合在一起,并解决外部引用,生成最终的可执行代码。.lib
(或 .a
)扩展名存储。链接器的主要工作是将库文件的目标代码与我们程序的目标代码相结合。有时,当我们的程序引用其他文件中定义的函数时,会出现这种情况;那么 linker 在这方面起着非常重要的作用。它将这些文件的目标代码链接到我们的程序。因此,我们得出结论,链接器的工作是将程序的目标代码与库文件和其他文件的目标代码链接起来。链接器的输出是可执行文件。可执行文件的名称与源文件的名称相同,但仅在扩展名上有所不同。在DOS中,可执行文件的扩展名为 .exe
,而在UNIX中,可执行文件可以命名为 a.out
。例如,如果我们在程序中使用 printf()
函数,则链接器会将其关联的代码添加到输出文件中。gcc main.o helper.o -o myprogram
.out
)。.hex
和 .bin
文件通常不是C语言编译过程的直接产物,而是在嵌入式系统开发中常见的文件格式,用于存储程序或数据的二进制表示。这些文件通常是在程序已经编译、链接并生成了可执行文件之后,通过特定的工具或者转换过程生成的。因此,它们不属于C语言编译过程的标准阶段,但是在嵌入式开发中是非常常见的文件格式。对于给定的C程序示例:
#include <stdio.h>
#define MAX 100
int main() {
printf("Max value: %d\n", MAX);
return 0;
}
#include <stdio.h>
并将 MAX
替换为 100
。printf
)结合,生成最终的可执行文件。hello.c
:
#include <stdio.h>
int main()
{
printf("Hello World !");
return 0;
}
现在,我们将创建上述程序的流程图:
在上面的流程图中,执行程序需要执行以下步骤:
hello.c
)传递给预处理器,预处理器将源代码转换为扩展的源代码。扩展源代码的扩展将是 hello.i
。hello.s
。理解这些步骤有助于优化代码、调试问题,并了解C编程中的平台特定细节。LuckiBit
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。