美文网首页Linux系统
Make-第一章:开篇

Make-第一章:开篇

作者: Sivin | 来源:发表于2020-01-06 21:10 被阅读0次

    准备知识

    编译:把高级语言编写的代码转换成机器可以识别的指令。编译后生成的指令虽然可以被机器识别,但是还不能执行。编译过程主要进行一下工作,编译器检查高级语言的语法,函数与变量的声明是否正确,只有所有语法正确,相关变量定义正确,编译器才能编译出中间的目标文件,通常一个高级语言的源文件,都可以对应一个目标文件,在Linux下目标文件的默认后缀为 ”.o"(如何“foo.c"的目标文件为”foo.o")

    链接:将多个“*.o”文件,或者“.o"文件和库文件链接成可以被操作系统执行的可执行程序(Linux下可执行文件的格式为”ELF"格式),链接器不会检查函数所在的源文件,只检查所有.o文件定义的符号。将.o文件中使用的函数和其他.o文件或者库文件中的相关符号进行和并,对所有文件中的符号进行重新定位。并链接系统相关文件(程序启动文件)最终生成可执行程序。链接过程使用GNU的 “ld"工具。

    静态库:又称为归档文件(Archive File)。他是多个.o文件的集合。Linux中静态库文件的后缀为”.a"。静态库中的各个成员(.o文件)没有特殊的存在格式,他仅仅是一个.o文件的集合,使用"ar"工具维护和管理静态库。

    共享库:也是多个.o文件的集合,但是这些.o文件是由编译器按着特殊的方式生成(Linux中,共享库文件格式通常为“ELF"格式。共享库已经具备了可执行条件)。模块中各个成员的地址(变量的引用和函数调用)都是相对地址,使用此共享库的程序在运行时,共享库被动态的加载到内并和主程序在内存中进行连接。多个可执行程序和共享库文件中的代码段(多个程序可以共享的使用库中的摸个模块。共享代码,不共享数据)。另外共享库的成员对象可被执行(有 libdl.so提供支持)。

    GNU make 介绍

    make 在执行时,需要一个命名为Makefile的文件,这个文件告诉make以何种方式编译源代码和链接程序,电信第,可执行程序可由一些.o文件按照一定的顺序生成或者更新。如果你的工程中已经存在一个或者多个正确的Makefile。当对工程中的若干文件修改以后,需要根据修改来更新可执行文件或者库文件。make会自动根绝修改情况完成源文件的对应.o文件的更新,库文件的更新,最终的可执行程序的更新。

    make通过比较对应文件的最后修改时间,来决定哪些文件需要更新,哪些文件不需要更新。对需要更新的文件make就执行数据库中所记录的相应命令(在Make读取Makefile以后会建立一个编译过程的描述数据库。此数据库中记录这所有文件之间的相互关系,以及他们的描述关系)来重建它。对于不需要重建的文件Make什么也不做。

    而且可以通过Make命令行选项来至指定需要重新编译的文件。

    Makefile简介

    在执行make之前,需要一个命名为Makefile的特殊文件来告诉make需要做什么(完成什么任务),该怎么做,通常,make工具主要被用来进行工程编译和程序构建。

    本节将来分析一个简单的Makefile,它对一个包含8个C的源码和三个头文件的工程进行编译和链接。这个Makefile提供了make必要的信息,make程序根据Makefile中的规则描述执行相关的命令来完成指定的任务(如:编译,链接和清除编译过程文件等)。复杂的makefile,我们将会在本文后续进行讨论。

    当使用make工具进行编译是,工程中的以下几种文件在执行make时会被重新编译

    • 所有的源文件没有被编译过,则对各个C源文件进行编译并重新链接,生成最后的可执行程序。
    • 每个在上次执行make之后修改过的C源文件在本次执行make时将会被重新编译一次
    • 头文件在上次执行make之后被修改。则所有包含此头文件的C源文件在本次执行make是将会被重新编译。

    后两种情况是make只将修改过的C源文件重新编译生成.o文件,对于没有修改过的源文件不进行任何工作。重新编译过程中,任何一个源文件的修改都将产生新的对应的.o文件,新的.o文件将和以前的已经存在,此次没有重新编译的.o文件重新链接生成最终的可执行程序。

    Makefile规则介绍

    一个简单的Makefile描述规则组成

    TARGET...:PREERQUISITES...
        COMMAND
        ...
        ...
    

    target:规则的目标。通常是最后需要生成的文件名或者为了实现这个目的而必需的中间过程文件名。可以是.o文件,也可以是最后的可执行程序的文件名等。另外,目标也可以是一个make执行的动作的名称,如目标“clean",我们称这样的目标是一个”伪目标“。

    prerequisites:规则依赖。生成规则目标需要的文件名列表。通常一个目标依赖于一个或者多个文件。

    command:规则的命令行。是规则所执行的动作(任意的shell命令或者可以在shell下执行的程序),它限定了make在执行这条规则时所需要执行的动作。

    一个规则可以有多个命令行,每一条命令占一行。注意:每一个命令必须以[Tab]字符开始,[Tab]字符告诉make此行是一个命令行。make按照命令完成响应的动作。这也是书写Makefile中容易产生的,而且比较隐蔽的错误。

    命令就是在任何一个目标的依赖文件发生变化后重建目标的动作描述。一个目标可以没有依赖而只有动作(指定的命令)。比如Makefile中的目标“clean" , 此目标没有依赖,只有命令。它所定义的命令用来删除make过程中产生的中间文件(进行清理工作)

    在Makefile中 “规则"就是描述在什么情况下,如何重建规则的目标文件,通常规则中包括了目标的依赖关系(目标的依赖文件)和重建目标的命令。make执行重建目标命令,来创建或者重建规则的目标(才目标文件也可以是触发这个规则的上一个规则中的依赖文件)。规则包含了文件中的依赖关系和更新此规则目标所需要的命令

    一个Makefile文件中通常还包含了除规则以外的很多东西。一个最简单的Makefile可能也只包含规则。规则在这些Makefile中可能看起来非常复杂,但是无论多么复杂,它都符合规则的基本格式。

    make程序根据规则的依赖关系,决定是否执行规则所定义命令的过程我们称之为执行规则

    相关文章

      网友评论

        本文标题:Make-第一章:开篇

        本文链接:https://www.haomeiwen.com/subject/ndnkactx.html