Unity3D热门教程

游戏开发工具

目标文件和可执行文件里面都有什么?

C编程的基本策略是

用程序把源代码文件转换为可执行文件(其中包含可直接运行的机器语言代码),典型的C实现通过编译和链接两个步骤来完成这一过程。编译器把源代码转换为中间代码,链接器把中间代码和其他代码合并,生成可执行文件。

4.png

C使用这种分而治之的方法方便对程序进行模块化,可以独立编译单独的模块,稍后再用链接器合并已编译好的模块。通过这种方式,如果只更改某个模块,不必因此重新编译其他模块。另外,链接器还将你编写的程序和预编译的库代码合并。


C程序开发的一般流程

1、定义程序的目标,明确程序的功能,明确程序中需要哪些信息、计算和控制,明确程序中应该报告什么信息,不会设计到具体的计算机语言,对于问题的描述一般用的是术语。

2、设计程序,考虑如何通过程序实现程序的目标,具体一点说,需要考虑的可以有用户界面的设计、程序的组织、目标用户的确定以及程序开发时间计划,除了这些,好需要确定是在程序中(也有可能是在辅助文件中)数据的表示形式以及数据的处理方法。这个阶段,不会用到具体的代码。问题的描述用的是一般术语,但是不排除某些决策会和具体的语言特性相关。

3、编写代码,具体实现设计好的程序。

4、编译,编译的细节取决于编译环境。

5、运行程序。

6、测试与调试程序,找Bug,改Bug。

7、维护与修改代码。

8、说明,对程序给出相应的注释。


编译过程中涉及到的目标文件、可执行文件和库

如下图所示,典型的C实现通过编译和链接两个步骤完成,编译器负责把源代码转换成中间代码,链接器把中间代码和其他代码合并,生成可执行文件。

1.png

中间文件有多种形式,最普遍的一种是将源代码转换成机器语言代码,并把结果放在目标代码文件中(简称目标文件)。虽然目标文件中包含机器语言代码,但并不能直接运行。因为其中存储的是编译器翻译的源代码,还不是一个完整的程序。

目标代码文件缺失启动代码(startup code),启动代码充当着程序与操作系统之间的接口。

目标代码还缺少库函数。几乎所有的C程序都需要使用C标准库中的函数。举例:源码中使用printf()函数,编译过程中的目标文件并不包含该函数的代码,仅仅是包含了使用该函数的指令。真正实现printf()功能的代码存放在‘库’文件中,库文件中包含很多功能函数的目标代码。

链接器的作用:将转换成目标代码、系统的标准启动代码、库代码这3部分进行合并,生成一个可执行文件。链接过程中,从库文件中提取的仅仅是程序中需要用到的。

简而言之,不管是目标文件还是可执行文件,其中存储的都是机器语言代码。不同的是,目标文件中包含的仅仅是将自己写的源代码原原本本转换出来的结果,目标文件中存储的,除了源代码的转换结果,还包括了相关的启动文件和库函数的机器代码。


目标代码文件与可执行文件的区别与联系

1、目标代码文件中包含机器语言代码,但不能直接运行改文件。

2、目标代码文件缺失启动代码。

3、目标代码文件缺少库函数。

链接器把编写的目标代码、系统的标准启动代码和库代码合并成一个文件,即可执行文件。

简而言之,目标文件和可执行文件都由机器代码指令组成。然而,目标代码文件只包含编译器为你编写的代码翻译的机器语言代码,可执行文件还包含你编写的程序中使用的库函数和启动代码的机器代码。


什么是源文件,目标文件,可执行文件

1、源代码文件

存放程序代码的文件,即我们编辑代码的文件,称为源代码文件。

C语言源程序文件的扩展名为“.c”。

源代码文件是相对目标文件和可执行文件而言的,一般是用高级语言写出来的。

1.png

2、目标文件

目标代码是指源代码经过编译程序产生的能被cpu直接识别二进制代码。

目标文件由编译器生成.具体的生成方法在不同的开发环境上是不同的。

目标文件的扩展名为“.obj”(Windows)或“.o”(Linux)。

2.png

目标文件已经是机器指令,但还不能运行,因为目标文件还没有解决函数调用问题。

gcc的例子: 

gcc -o target_file test.c 

编译test.c生成可执行文件target_file 

gcc -c test.c 

编译test.c ,生成目标文件test.o,但不进行link.  


3、可执行文件

链接器将目标代码、库代码和系统标准启动代码结合在一起,形成的完整的可在操作系统下独立执行的程序,称为可执行文件。

可执行文件的扩展名为“.exe“(Windows)。

可执行代码就是将目标代码连接后形成的可执行文件,当然也是二进制的。 

连接程序系统库文件连接就生成可执行文件。 

例如:*.obj是程序编译之后生成的目标文件,连接程序再将这个文件与系统库文件连接就生成可执行文件