企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
C源代码 预处理---->把所有的宏定义全部替换等。 编 译------>形成目标代码。 链 接------>将目标代码与C函数库相连接。 执 行------>运行C程序。 再详细讲这四步之前,我先来强调一下,它们不是单独的四步,而是两步!!!! 第一步:**预处理完成的源代码======>多个单独的目标代码。** 第二步:**多个单独的目标代码======>和库,启动,终止这三部分链接** 第三步:可执行文件就诞生了。。。。。。 嘿嘿。小明又来说废话了。。 **小明:**细胞也是分的两步,转录和翻译。我是不是可以类比一下? **蝌蚪哥**:什么叫类比,明明就模仿的好吧。信使mRNA去转录的DNA链,接着反密码子tRNA带着特定的氨基酸来到链上,合成肽链。 ![](https://box.kancloud.cn/2015-11-12_56448354c4e4b.png) 在mRNA链的开始,会有启动密码子,在末尾有终止密码子。这样tRNA就知道如何开始,何时终止。而它的合成过程,就是线性的过程。 **小明**:既然你说程序是模仿的,那详细说一下程序是如何模仿的吧。 **蝌蚪哥**:想要理解程序是怎么跑起来的,必须理解一个很重要的概念:**程序是像水一样流动的,建立在线性基础之上的**。 “初探c语言底层”中讲到:c语言是建立在内存单元上的。那么程序也是按照内存单元的地址,从首地址一直执行到末地址的。这是无法改变的。如果你写的程序大了的话,你就会把代码打包成多个.c文件,然而多个.c文件也都是基于同一个main()函数运行的。 main()函数是操作系统连接程序的入口。 一个链接后的程序应该是这个样子: #### 启动代码(操作系统分配) #### main()(自己编写的多个目标代码+库函数+操作系统的动态库) #### 终止代码(操作系统分配) 链接就是把上面各个“密码子”连成程序链。。最后从始至终。 例子: a.c文件代码: \#include"stdio.h" \#include"b.h" int main(){ printf("aa"); } b.h文件代码: \#include"b.c" b.c文件代码: int a; 最终获得了a.c, b.c, b.h,(实际上编译的时候还有stdio.h和stdio.c这2个文件。) 这5个文件经过预处理和编译所生成的目标代码。。和下面这个文件生成的目标代码是一样的。 a1.c文件代码: \#include"stdio.h" int a; int main(){ printf("aa"); } 因为链接在了一起,就相当于一个完整的文件。最后加上启动和终止这两段代码。。这个a.out或a1.out就跑起来了。 留给各位一个问题:a1.out大小和a1.c的大小和a1.out跑起来时a1.exe的大小(从windows的任务管理器中查看) 三者有什么关系?