一、Makefile
1、什么叫做Makefile ??
Makefile 文件 称之为工程管理文件, 用来管理 一个工程 中所有的文件,包括 源文件 头文件 库文件.....
2、目的
主要是为了简化编译的复杂度
二、项目工程 由 哪些文件组成??
1、简单
多个源文件
2、复杂
三、Makefile 文件的规则
1、规则的核心: “依赖” “目标"
依赖: 指的是 源文件 .c文件 main.c func1.c func2.c
目标: 指的是 可执行程序文件 main
2、makefile 书写规则
1)确定目标叫什么名字
2)按照以下规则书写 makefile
目标文件:依赖文件(如果有多个依赖,每个依赖文件之间使用空格分开) <Tab按键>执行规则
main:main.c func1.c func2.c gcc $^ -o $@ -I ./
重复执行make ,会出现第二次执行的时候提示:
gec@ubuntu:/mnt/hgfs/GZ22229/05/1-code/06project1-makefile$ make make: “bin/project”已是最新。 gec@ubuntu:/mnt/hgfs/GZ22229/0
makefile 编译规则:
在makefile编译之前,都会检测所有的依赖对应的修改时间是否与上次编译的修改时间一致,如果所有的依赖都没有修改过,则不会进行编译,如果有一个依赖的时间被修改过,则makefile就会再次编译。
四、makefile 多个目标情况
target1:
XXXXX
target2:
XXXXX
target3:
XXXXX
执行make --》默认执行的是第一个目标
执行 make target2 -->指定执行 target2
./bin/project:./c_source/project.c gcc $^ -o $@ -I ./include -L ./lib -ladmin -luser clean: rm ./bin/project
五、makfile变量种类
1、自定义变量
所有的变量 都是 字符串类型
A = "hello" B = "world" 其实也可以不用加 ""
引用变量
B = $(A) world
简单版的makefilef
TARGET = project
C_SOURCE = main.c func1.c func2.c
$(TARGET):$(C_SOURCE)
gcc $^ -o $@ -I ./
clean:
rm $(TARGET)
复杂版的makefilef
TARGET = ./bin/project
C_SOURCE = ./c_source/*.c
INCLUDE_PATH += -I ./include
LIBRARY_PATH += -L ./lib
LIB += -ladmin
LIB += -luser
$(TARGET):$(C_SOURCE)
gcc $^ -o $@ $(INCLUDE_PATH) $(LIBRARY_PATH) $(LIB)
clean:
rm $(TARGET)
2、系统预设定变量
有的变量已经在系统中定义好了,并且已经赋值,我们直接引用即可。
CC -->编译器名字,默认等于cc cc等价于gcc 也就是说 CC = gcc
RM -->删除命令 ,默认等于 rm -f 也就是说 RM = rm -f
这些变量如果不赋值,就按默认的值来处理,但是这些变量也是可以赋值的,如果赋值了,就按新的值来处理。
CC = gcc
TARGET = ./bin/project
C_SOURCE = ./c_source/*.c
INCLUDE_PATH += -I ./include
LIBRARY_PATH += -L ./lib
LIB += -ladmin LIB += -luser
$(TARGET):$(C_SOURCE)
$(CC) $^ -o $@ $(INCLUDE_PATH) $(LIBRARY_PATH) $(LIB)
clean:
$(RM) $(TARGET)
3、自动化变量 --》变量的值不是固定的,而是变化的。
$^ -->代表所有的依赖
$@ -->代表所有的目标
六、makefile伪指令
场景一:假设makefile中有一套规则:
clean:
$(RM) bin/main
当我们执行make clean时,makefile就会执行这套规则。
场景二:假设makefile中有一套规则,并且当前目录下有一个目录名字叫clean/
clean:
$(RM) bin/main
当我们执行make clean时:
make: 'clean' is up to date.
如何告诉编译器,这个make clean是一套规则,而不是一个生成文件?
解决方案:使用伪指令。
怎么添加?-> 只需要在makefile中添加一句话就可以。
.PHONY:clean
七、makefile函数
1、wildcard -->在指定的路径下寻找匹配的文件
C语言函数调用 函数名(参数1,参数2,参数3)
makefile函数调用 $(函数名 参数1,参数2,参数3)
比如:我想把当前目录下的所有.c文件名都找出来,并且将这些文件名保存在一个变量C_SOURCE中
C_SOURCE = $(wildcard ./c_source/*.c)
TARGET = ./bin/project
C_SOURCE = $(wildcard ./c_source/*.c)
INCLUDE_PATH += -I ./include
LIBRARY_PATH += -L ./lib
LIB += -ladmin
LIB += -luser
$(TARGET):$(C_SOURCE)
$(CC) $^ -o $@ $(INCLUDE_PATH) $(LIBRARY_PATH) $(LIB)
clean:
$(RM) $(TARGET)
.PHONY:clean