Linux下实用功能make的使用入门

    xiaoxiao2021-03-25  113

    make是一个命令工具,它解释Makefile中的指令(应该说是规则)。

    首先我们先来了解一下一个程序从诞生到形成可执行文件的过程。

    编译:把高级语言所书写的代码转换成机器可识别的指令,此时还不能够被执行,编译器通过检查高级语言的语法,函数和变量的声明是否正确!如果正确则产生中间目标文件。(目标文件在Liunx中默认后缀为“.o”)

    gcc -c main.c(只编译不链接)

    链接:将多.o文件,或者.o文件和库文件链接成为可被操作系统执行的可执行程序。

    补充知识: 1、静态库:又称为文档文件(ArchiveFile)。它是多个.o文件的集合,在Linux中静态库文件的后缀为“.a” 。 2、 共享库:也是多个.o文件的集合,但是这些.o文件时有编译器按照一种特殊的方式生成。

    有了这些,进入主题。

    在执行make之前,需要一个命名为Makefile的特殊文件来告诉make需要做什么(完成什么任务),该怎么做。

    makefile文件的简单介绍 基本规则: 目标: 依赖对象 <tab> 处理命令 <tab> 处理命令 例: prog: file1.f file2.f file3.o f77 -O2 -o prog file1.f file2.f file3.o

    目标:1)通常是执行下带的处理命令生成的文件名,这也是我们在这一个命令处理中想要得到的目标文件名。可以是.o文件、也可以是最后的可执行程序的文件名等。2)另外,目标也可以是一个make执行的动作的名称,如目标“clean”。 依赖对象:生成规则目标所需要的文件名列表。通常一个目标依赖于一个或者多个文件。 处理命令:规则的命令行。是规则所要执行的动作(任意的shell命令或者是可在shell下执行的程序)。它限定了make执行这条规则时所需要的动作。

    一个规则可以有多个命令行,每一条命令占一行。注意:每一个命令行必须以[Tab]字符开始,[Tab]字符告诉make此行是一个命令行。make按照命令完成相应的动作。书写时,可以将一个较长行使用反斜线(\)来分解为多行。

    一个makefile文件是由多个以上介绍的基本规则单元构成的,不同的单元之间可能存在依赖关系,比如我这个单元的依赖对象恰好是其他单元的目标。 当执行make时,默认下往往是执行第一个单元的规则,第一个单元里面的目标,也是终极目标。执行执行过程往往是根据对象之间的依赖关系层层展开,从而用到其他单元的规则。最后得到想要的终极目标。

    执行一个规则的过程是这样的: 对于一个存在的规则(明确规则和隐含规则),首先,make程序将比较目标文件和所有的依赖文件的时间戳。如果目标的时间戳比所有依赖文件的时间戳更新(依赖文件在上一次执行make之后没有被修改),那么什么也不做。否则(依赖文件中的某一个或者全部在上一次执行make后已经被修改过),规则所定义的重建目标的命令将会被执行。这就是make工作的基础。

    宏定义 和c语言的宏定义是一个意思的。如: 宏定义: SRC=file1.f file2.f file3.c prog: $(SRC) f77 -O2 -o prog $(SRC) 环境变量可以在Makefile中作为宏使用, 如$(HOME)。 常用于预定义的宏的命令: $@: 代表目标名(上例中为prog) $<: 第一个依赖对象名(上例中为file1.f) $^: 全部依赖对象名(上例中为file1.f file2.f file3.c) $?: 全部比目标新的依赖对象名 $*: 用在隐式规则中, 代表不含扩展名的依赖对象 隐式规则 “隐含规则”也就是一种惯例,make会按照这种“惯例”心照不喧地来运行,那怕我们的Makefile中没有书写这样的规则。例如,把[.c]文件编译成[.o]文件这一规则,你根本就不用写出来,make会自动推导出这种规则,并生成我们需要的[.o]文件。 makefile暗含的隐式规则还是比较多的,可以在实际应用中体会,这里不做细说。 举例1prog: file1.o file2.o file3.o f77 -O2 -o prog $? .c.o: cc -O2 -c $*.c .f.o: f77 -O2 -c $*.f 举例2: CC=mpicc FFLAG=-g CFLAG=-g .f.o: $(MPIF77) $(FFLAGS) -c $*.f .c.o: $(CC) $(CFLAGS) -c $*.c sendrecv: sendrecv.c $(CC) $(CFLAG) -o $@ $< clean: rm -f *~ *.o a.out 写好了makefile文件后,就可以通过命令行来运行了。 命令形式: make [-f Makefile] [options] [target [target ...]]

    其中-f选项给出定义规则的文件名(简称Makefile文件), 缺省使用当 前目录下的Makefile或makefile文件。 target指明你要生成那个目标,其实也就是执行Makefile文件中的哪个单元的规则的意思。

    比较有用也较通用的命令行选项有 下面一些: -f文件名: 指定Makefile文件名。 -n: 只显示将要执行的命令而并不执行它们。 -p: 显示定义的全部规则及宏, 用于对Makefile的调试。

    举例:

    make

    make target2

    make clean

    make -n

    转载请注明原文地址: https://ju.6miu.com/read-33638.html

    最新回复(0)