Makefile入门
生如芥子,心藏须弥。
一、什么是Makefile
1、Makefile
Makefile是一个文件,里面写的是项目的编译规则,它会根据文件的时间戳来推导本次编译的时候某些源文件是否需要重写编译,在项目程序中会有大量的不同文件需要同时编译,以及在后来需要修改部分文件时就不需要再把全部文件都编译一次了。
2、make
make是一个可执行程序,是专门用来make是解析Makefile文件的可执行程序。
make安装命令:sudo apt-get install make
二、Makefile的语法格式
1、语法格式1
makefile中使用 # 注释
标签必须顶格写,指令需要以一个 tab 开头
#标签名:
#指令
order:
ls -l
2、语法格式2
#目标:依赖
#编译的指令
test:test.o
gcc test.o -o test
test.o:test.s
gcc -c test.s -o test.o
test.s:test.i
gcc -S test.i -o test.s
test.i:test.c
gcc -E test.c -o test.i
3、执行Makefile
(1)make
这种方式 make会自动在当前路径下找名为 Makefile 或者 makefile 的文件来执行,默认执行第一个标签下的指令。
(2)make 标签名
执行指定标签下的指令。
标签:分为目标、伪目标
目标:编译完成之后会生成目标对应的文件。
伪目标:编译完成之后不会生成目标对应的文件。
(3)make -f Makefilename
执行指定的Makefile文件。
三、Makefile中的变量
1、变量
与shell中的变量相似,没有变量类型直接赋值
#= 会将变量在Makefile中所有赋值的语句都找到
将最后一次的结果赋值给新的变量
VAL1=hello
VAL2=$(VAL1)
VAL1=1234
all:
##echo 终端打印 相当于printf
@echo $(VAL2) # @表示取消执行时 指令的回显
#结果 : 1234
#:= 立即赋值
VAL1=hello
VAL2:=$(VAL1)
VAL1=1234
all:
@echo $(VAL2) #结果 : hello
#+= 追加赋值 拼接
VAL1=hello
VAL1+=1234
all:
@echo $(VAL1) #结果 : hello 1234
#?= 询问赋值
?前的变量是否已经被赋值过,如果赋值过,本次赋值不成立
VAL1=hello
VAL1?=world
all:
@echo $(VAL1) #结果 : hello
2、特殊的变量
符号 | 作用 |
---|---|
$@ | 目标文件 |
$^ | 所有的依赖文件 |
$< | 第一个依赖文件 |
替换前:
hqyj:main.o network.o database.o file.o
gcc main.o network.o database.o file.o -I ../include -o hqyj
main.o:main.c
gcc main.c -I ../include -c -o main.o
network.o:network.c
gcc network.c -I ../include -c -o network.o
database.o:database.c
gcc database.c -I ../include -c -o database.o
file.o:file.c
gcc file.c -I ../include -c -o file.o
clean:
rm *.o # * 是shell命令的通配符 表示通配任意长度的任意字符
rm hqyj
替换后:
OBJ=main.o network.o database.o file.o
CC=gcc
TARGET=hqyj
INCLUDE=-I ../include
FLAG=-c -o
$(TARGET):$(OBJ)
$(CC) $^ $(INCLUDE) -o $@
%.o:%.c
$(CC) $< $(INCLUDE) $(FLAG) $@
clean:
rm $(OBJ) $(TARGET)
3、通配符
*:当makefile中需要执行linux命令的时候,表示linux命令的通配符,如 VAL=$(shell ls *.c) 表示将在当前路径执行 ls *.c 的结果 赋值给 VAL
%:它才是Makefile中的通配符 (通配任意长度的任意字符)
4、项目目录
目录 | 文件内容 |
---|---|
src | 存放源文件的 .c |
include | 存放头文件的.h |
obj | 存放目标文件.o |
bin | 存放可执行文件a.out |
cfg | 存放配置文件 |
log | 存放日志文件 |
lib | 存放库文件.so .a |