Makefile 概述 程序的编译和链接 介绍 如何工作的 自动推导

概述

      工程中的源文件很多,一般都是按类型、功能、模块分别放在各个目录中

      makefile 定义了一系列的规则来指定,哪些文件先编译,哪些文件后编译,哪些文件重新编译,还有些进行更复杂的功能操作
      makefile 好处:“自动化编译”,只需要 make 命令,整个工程完全自动编译,提高了开发的效率

      make :解释 makefile 中指令的命令工具

      遵循于 IEEE 1003.2-1992 标准的(POSIX.2)

程序的编译和链接

    编译(compile):把源文件编译成中间代码文件(Object File)(O 文件或 OBJ 文件)

    链接(link):大量的 Object File 合成 执行文件
    可把中间目标文件打个包( Archive File): .a 文件

Makefile 介绍

  规则:

      工程没有编译过,那所有 C 文件都要编译并被链接
     工程的某些 C 文件被修改,那只编译被修改的 C 文件,并链接目标程序

     工程的头文件改变,那就需要编译引用这些头文件的 C 文件,并链接目标程序

# target:目标文件、 Object File、执行文件、标签(Label
# prerequisites:生成 target 需要的文件、目标
# command:make 需要执行的命令
# prerequisites中有一个以上的文件比 target 文件更新,command 就会被执行
target ... : prerequisites ...
command
# make : 成执行文件 text
# make clean : 删除执行文件和所有的中间目标文件
# 目标文件(target):执行文件(text) , 中间目标文件(*.o)
# 依赖文件(prerequisites):' : '后面的 .c 文件和 .h 文件
# 一定要以一个 Tab 键作为开头
text : mian.o command.o files.o
    cc -o text mian.o command.o files.o

main.o : main.c command.h files.h
    cc -c main.c

command.o : command.c command.h
    cc -c command.c

files.o : files.c files.h
    cc -c files.c

# 冒号后什么没有,那么 make 就不会自动去找文件的依赖性
clean :
    rm text mian.o command.o files.o

make 是如何工作的

       make 会在当前目录下找名字叫“Makefile”或“makefile”的文件

      找到,它会找文件中的第一个目标文件(target), 例子中,他会找到“ text ”这个文件,并把这个文件作为最终的目标文件

      text 文件不存在 或 text 所依赖的后面的 .o 文件的文件更新了,就会执行后面所定义的命令来生成 text文件

      text 依赖的.o 文件存在,那 make 会在当前文件中找目标为.o 文件的依赖性,找到则规则生成.o 文件

     C 文件和 H 文件是存在, make 会生成 .o 文件, 然后再用 .o 文件 make ,也就是执行文件 text
 

     整个 make 的依赖性,make 会一层又一层地去找文件的依赖关系,最终编译出第一个目标文件
     如果出现错误,make 会直接退出,并报错

makefile 中使用变量

  为了 makefile 的易维护,在 makefile 中可以使用变量

# 定义一个变量
OBJECTS = mian.o command.o files.o

text : $(OBJECTS)
    cc -o text $(OBJECTS)

main.o : main.c command.h files.h
    cc -c main.c

command.o : command.c command.h
    cc -c command.c

files.o : files.c files.h
    cc -c files.c

# 冒号后什么没有,那么 make 就不会自动去找文件的依赖性
clean :
    rm text $(OBJECTS)

 make 自动推导

       make 会自动推导文件以及文件依赖关系后面的命令

      只要 make 看到一个[.o]文件,它就会自动的把[.c]文件加在依赖关系中
 

# make 的“ 隐晦规则 ”
OBJECTS = mian.o command.o files.o

text : $(OBJECTS)
main.o : command.h files.h
command.o : command.h
files.o : files.h

# ' .PHONY '表示,clean: 伪目标文件
# clean 放在文件的最后
# -rm :某些文件出现问题不用管,继续执行
.PHONY : clean
clean :
    -rm text $(OBJECTS)

 

全部评论

相关推荐

妄想山海启动:9硕都比不上9本
点赞 评论 收藏
分享
在逃香菇:考研去92,我领导筛hr筛过的简历的时候明说了:普通学校的本硕没区别。我司今年秋招嵌入式软件这边已经没有本科生了
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务