Makefile编写学习

一、基本内容

1.功能:指定编译规则,将来程序编译按照规则进行,本质就是一个文本文件

2.语法:

核心要义:

目标:依赖1 依赖2 依赖3 ...依赖n
    (TAB)规则  //依赖文件通过规则生成目标文件;必须是TAB

注:规则可以理解为编译命令

例如:

vi hello.c
vi Makefile
hello:hello.c
    gcc hello.c -o hello

3.养成查阅字典的习惯:《GNU make v3.80完整版中文指南》

4.Makefile文件执行流程

参考代码

helloworld:helloworld.o
    gcc helloworld.o -o helloworld
helloworld.o:helloworld.c
    gcc -c helloworld.c -o helloworld.o

①当执行make命令时,make命令首先在当前目录下找Makefile文件

②找到后,make命令打开Makefile文件,然后找到所有的编译规则,最终确定要产生的目标文件(helloworld)源文件(helloworld.c)

③如果目标文件(helloworld)存在,就检查它的依赖文件(helloworld.o)是不是最新的,如果是,说明文件被修改过,重新执行规则编译,生成最新的helloworld,如果依赖文件(helloworld.o)也是最新的,那么检查helloworld.o的依赖文件(helloworld.c)是不是最新的,如果是,说明文件被修改过,重新执行编译命令。

④如果在当前目录下目标文件(helloworld)不存在,make就会找到当前目录下是否存在它的依赖文件(helloworld.o),如果存在直接运行规则"gcc helloworld.o -o helloworld"生成helloworld即可;如果没有找到helloworld.o,那么就会找它的依赖文件hellworld.c是不是存在,存在直接执行"gcc -c helloworld.c -o helloworld.o"即可,不存在则报错!

总结:不管是时间戳的查找还是文件存在的查找,都是从上往下进行,而命令的执行是从下往上执行的

5.伪目标

①伪目标即没有依赖的目标

例如:

all:
    编译命令A
clean:
    编译命令B

当执行make all时,执行对应的编译命令A,当执行make clean时,执行对应的编译命令B

clean:
    rm helloworld helloworld.o

优化:

.PHONY:clean
clean:
    rm helloworld *.o

注:这样目标“clean”就是一个伪目标,无论当前目录下是否存在“clean”这个文件,只要输入“make clean”,就会被执行

6.Makefile多文件编写

main:main.o test.o
        gcc main.o test.o -o main
test.o:test.c
        gcc -c test.c -o test.o
main.o:main.c
        gcc -c main.c -o main.o
clean:
        rm main *.o

注:颠倒test和mian的编译不影响

7.Makefile编写技巧

①将所有的.c文件只编译不链接生成.o文件

%.o:%.c
    gcc -c $< -o $@

其中:

%.o:目标文件

%.c:源文件

$@:生成的目标文件

$<:源文件

参考代码:

②变量的使用

Makefile中的变量类似C程序的#define宏,一般建议用大写;这样可以使Makefile的移植性更强,编写更加灵活

定义如下:
 

1)OBJ=main.o
2)OBJ:=main.o
3)OBJ=main.o
  OBJ+=test.o
  结果:OBJ=main.o test.o
4)OBJ?=main.o  #如果OBJ先前赋过值,此句话则无效,否则有效
  或者:  
  OBJ=mian.o
  OBJ?=test.o
  结果:OBJ=mian.o
5)引用变量的内容用"$(变量名)"
  例如:$(OBJ)

参考代码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值