makefile文件(项目管理工具)是GNU工具链的一部分。
优点
1.重用性极强(一次编写终身受益) ,可以反复使用管理不同的项目
2.便捷的编译管理代码,不用每次书写复杂的编译命令
3.节省编译时间
编译时间分为:编译期(预编译、编译、汇编)+链接期(把所有的.文件链接生成可执行文件)
编译期: 源文件.c编译生成.o文件
第一次编译的时候不会节省编译时间,会保存所有生成的中间文件.o文件,下一次编译的时候只编译修改的源文件,重新生成.o文件,没有修改的源文件直接使用保存的.o文件,一起链接生成可执行文件。
怎么判断源文件是否被修改?
比较源文件的修改时间和.o文件的生成时间,如果源文件的修改时间更新,说明生成.o文件以后源文件又被修改过,需要重新编译。
命名 必须以makefile或者Makefile命名
注释 #
Makefile三要素:
1.目标:完成编译,生成可执行文件,可执行文件名字就是目标。
2.依赖:源文件或者资源文件
3.命令:根据依赖生成目标要执行的命令
书写格式
目标:依赖
命令(前面不是空格是tab)
执行makefile文件: make
第一次编译的时候不会节省编译时间,会保存所有生成的中间文件.o文件。
下一次编译的时候只编译修改的源文件。
makefile执行原理和注意事项
自顶向下建立依赖关系。
默认只有一个最终目标,可以有多个中间目标。
要把最终目标写到最上面。
makefile变量定义和使用
1.自定义变量:
没有数据类型,默认都是字符串。
变量名可以由字母、数字、下划线构成,不能以数字开头,为了于高级语言区分,一般都使用全大写。
使用: $(变量名)
2.内置:
$@ 表示目标名,随着目标名字的变化而变化
$^ 表示所有依赖项
$< 表示第一个依赖项
使用内置变量替换前和替换后:
内置函数和内建语法
1.wildcard文件名处理函数:获取某个路径下的所有文件名
#获取当前路径下所有.c文件的名字,存到变量SOURCEFIIE
SOURCEFILE=$(wildcard *.c) #SOURCEEIIE=main.c add.c sub.c mul.c des.c
2.patsubst字符串处理函数
#使用patsubst把SOURCEFILE里面的所有.c文件名字变成.o文件存到DFILE变量
DFILE=$(patsubst %.c,%.o,$(SOURCEFILE)) #DFILE=main.o add.o sub.o des.o mul.o
3.内建语法
%.o:%.c
gcc -c $< -I../include
使用内置函数和内建语法替换前和替换后:
常用变量
TARGET=myapp | 存储目标名字 |
CC=gcc | 用于存储编译器版本 |
INCLUDE_PATH=../include | 存储头文件路径 |
LIBRARY_PATH=../lib | 存储库文件路径 |
INSTALL_PATH=/usr/bin | 存储安装路径 |
CFLAGS=-I$(INCLUDE_PATH) -c -Wall | 存储编译选项 |
CPPELAGS=-D | 预处理选项 |
使用常用变量替换前和替换后:
定义为变量的好处是,方便以后的修改。
功能目标: 没有依赖,只有命令
1、删除:
clean:
rm -rf $(DFILE) $(TARGET)
2、安装:
install:
sudo cp $(TARGET) $(INSTALL_PATH)
3.卸载:
使用时候要注意不要有空格,可以先输出一下试试,有空格就会删除路径下的所有文件
定义路径变量时,语句和注释中间不要有空格
uninstall:
sudo rm -rf $(INSTALL_PATH)/$(TARGET)
4.输出:
output:
echo $(INSTALL_PATH)/$(TARGET)