1.程序的翻译环境和执行环境
在ANSI C的任何一种实现(编译器)中,存在两个不同的环境。
第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。
第2种是执行环境,它用于实际执行代码。
test.c要经过翻译环境变成可执行程序。可执行程序(test.exe)依赖执行环境实现效果。
二进制指令只有机器可以读懂,所以也叫机器指令。
![](https://i-blog.csdnimg.cn/blog_migrate/0101d0c24ce3b5630225224c73e545fd.png)
翻译环境就是将C语言的源代码翻译成机器能读懂的二进制指令
翻译环境可以再分为两个过程:编译和链接
C语言源代码经过编译会生成一个目标文件,目标文件经过链接可以得到二进制文件
C语言代码在被编译后按ctrl+f7,在工程名路径底下(存在test.c的)的debug中有一个test.obj文件,在windows底下,以obj为后缀名的,就是目标文件。
一个工程中还可能存在多个如test.c一样的.c源文件,每一个.c文件都会单独经过编译生成一个.obj文件。
如存在test.c,add.c,sub.c源文件(写好的源代码),每个源文件都会单独进行编译器处理生成目标文件test.obj,add.obj,sub.obj
所有目标文件和链接库整体经过链接处理生成test.exe。
![](https://i-blog.csdnimg.cn/blog_migrate/49ab02ffbe0cea9cc63eded2511eb82c.png)
编译过程依赖编译器,链接过程依赖链接器。
程序的编译分为4个阶段:预处理,编译,汇编,链接
预处理是进行宏替换,去注释等操作,编译是先进行语法检错,然后把C语言代码编译成汇编代码(即目标文件),汇编就是把汇编代码编译成二进制机器指令。链接是将所有用到的代码打包,生成可执行程序
链接库就是把所用到的库函数从库中拿出来,头文件的作用是在编译时告诉编译器,这个函数是有的,格式如何,编译完成后进行链接时会从库中拿出来,头文件的作用是声明。
![](https://i-blog.csdnimg.cn/blog_migrate/b3f5171c6244c90b217cded1d4101db1.png)
printf函数是C语言提供的,printf放在Libraries中,以.LIB为后缀的就是库。
静态库是指在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为"库"文件;在链接步骤中,链接器将从库文件取得所需的代码,复制到生成的可执行文件中的这种库。
软件中源代码编译成静态库来完成各种功能。
下面将使用Linux中的gcc编译器演示程序编译和链接的过程。
先了解Linux的基本操作指令:is——列出当前目录中的东西,图二是有东西的情况
![](https://i-blog.csdnimg.cn/blog_migrate/58cb2c58176c825472220a80f2749ae6.png)