工程管理器
GCC编译器编译程序的局限性:
(1)、程序往往由多个源文件组成,源文件个数越多,GCC的命令行就越长;此外,各种编译规则也会加大GCC命令行的复杂度,所以在开发调试程序的过程中,通过输入GCC命令行来编译程序是很麻烦的;
(2)、在程序的整个开发过程中,调试的工作量占到了整体工作量的70%以上,在调试程序的过程中,每次调试一般只会修改部分源文件,而在使用GCC命令行编译程序时,GCC会把那些没有修改的源文件一起编译,从而影响整体的编译效率;
GCC提供了半自动的工程管理器Make,所谓半自动化是指在使用工程管理器之前需要人工编写程序的编译规则,所有的编译规则都保存在Makefile文件中,全自动化的工程管理器在编译程序前会自动生成Makefile文件;
Make工程管理器的优越性:
(1)、使用方便;通过命令“ Make“就可以启动Make工程管理器对程序进行编译,不再需要每次都输入GCC命令行,Make启动后会根据Makefile文件中的编译规则命令自动对源文件进行编译和链接,最终生成可执行文件;
(2)、调试效率高;为了提高编译程序的效率,Make会检查,每个源文件的修改时间(时间截);只有在上次编译之后被修改的源文件才会在接下来的编译过程中被编译和链接,从而避免多余的工作量,为了保证源文件具有正确的时间截,必须保证操作系统时间的正确性(注意VMWare虚拟机的CMOS时间是否正确);
Makefle:
Make工程管理器是完全根据Makefile文件中的编译规则命令进行规则的;Makefile文件由三项基本内容组成:
●需要生成的目标文件( target file)
●生成目标文件所需要的依赖文件 (dependency file )
●生成目标文件的编译规则命令行(command)
这三项内容按照下面格式进行组织:
target file : dependency file
command
Make工程管理器在编译程序时会检查每个依赖文件的时间截,一旦发现某个依赖文件的时间截比目标文件要新,就会执行目标文件的命令来重新生成目标文件,这个过程称为目标文件的依赖规则检查;依赖规则检查是Make工程管理器的最核心的工作任务之一;
Make工程管理器编译程序的过程如下:
(1)、Make工程管理器首先会在当前目录下读取Makefile文件;
(2)、查找Makefile文件中的第一个目标文件,该文件也是Make工程管理器本次编译任务的最终目标;
(3)、把目标文件的依赖文件当作目标文件依赖规则检查;这是一个递归的检查过程;
Make会根据以下三种情况进行处理:
•••••如果当前目录下没有或缺少依赖文件,则执行其规则命令生成依赖文件;
•如果存在依赖文件,则把其作为目标文件来检查依赖规则;
•如果目标文件比所有依赖文件新,则不做处理;
(4)、递归执行第三步后,就会得到目标文件所有最新的依赖文件了;接着Make会根据以下三种情况进行处理:
••••如果目标文件不存在(比如第一次编译),则执行规则命令生成目标文件;
••如果目标文件存在,但存在比目标文件要新的依赖文件,则执行规则命令更新目标文件;
•目标文件存在,且比所有依赖文件新,则不做处理;
(5)、