自动编译管理项目源码, 节省编译时间, 复用性强
https://www.cnblogs.com/xkDiogt/p/13507627.html
.c文件——>.o文件(中间文件)——>可执行程序文件
只可以Makefile或makefile, 其他文件名不允许使用
include目录:头文件
lib目录:库
Makefile文件:调度所有子目录下的Makefile
src目录:源码文件 + Makefile文件
1. 变量名尽量用大写(规范)
2. 默认情况变量存储的类型是字符串
3. 变量定义必须初始化
4. 使用变量的值, 需要进行取值操作:$(变量名)
5. # 表示单行注释
VAR=‘hello‘ $(VAR) # 使用VAR变量的值
目标、依赖、命令
app:
echo $(VAR)
app:目标
依赖在目标后, 可以为空
echo $(VAR):命令前必须要有一个或多个制表符(tab键)
使用三要素编译项目
app:main.c add.c sub.c des.c
gcc *.c -I../include -o app
Makefile节省编译时间的原理:
1. 源码编译时需要大量的磁盘空间存放临时文件和中间文件
2. 项目完成之后将中间文件和临时文件删除
耗时的部分在生成中间文件, Makefile通过保留中间文件和临时文件节省编译时间
如果某一个.c文件修改了, 只需要将修改的文件重新生成就可以了(通过比较文件修改的时间, 目标比依赖新就不需要重新生成)
没有依赖就无法比较时间, 没办法节省时间
app:main.o add.o sub.o mul.o des.o gcc *.o -o app main.o:main.c gcc -c -I../include main.c
add.o:add.c
gcc -c -I../include add.c
mul.o:mul.c
gcc -c -I../include mul.c
des.o:des.c
gcc -c -I../include des.c
sub.o:sub.c
gcc -c -I../include sub.c
通过make命令即可执行当前目录下的makefile
make
自上向下分析, 自下向上执行
Makefile默认只能执行一个独立的目标(目标之间没有依赖)
有多个独立的目标会执行第一个
完成特定任务
clean目标:清除临时文件和中间文件
install目标:将编译生成的可执行程序转移到指定目录下(PATH:/usr/bin/)
distclean目标:将程序从指定路径中删除
clean: rm *.o -rf rm app -rf install: sudo mv app /usr/bin distclean: sudo rm /usr/bin/app
执行功能目标:
make clean
如果当前目录存在和功能目标同名的文件, 功能目标将无法使用, 通过伪目标解决
伪目标:(忽略当前目录下和功能目标同名的文件)
在功能目标前添加这行代码即可
.PHONY:clean install distclean
%:表示通配符
$<:第一个依赖
$@:目标名
$^:所有依赖
获取文件名函数:
SRCFILE=$(wildcard *.c) # 获取当前目录下所有.c文件
字符串处理函数:
DESFILE=$(patsubst %.c, %.c, $(SRCFILE)) # 将.c文件名改为.o文件名
app:$(DESFILE) gcc *.o -o app %.o:%.c gcc -c -I../include $<
@:修饰命令行, 执行make命令后, 不显示命令行本身, 直接显示命令行的结果
echo:
@echo $(VAR)
-:如果命令失败, 兼容错误, 向后执行其他命令, 没有修饰, Makefile直接退出
removfile: -rm clean -rm clean_1
CC=gcc CFLAGS=-c -g -Wall -I$(INCLUDEPATH) INCLUDEPATH=../include CPPFLAGS=-E -D -O1 -O2 -O3#预处理选项 LIBRARYPATH=../lib # 库路径 LIBNAME=pthread # 库名 LDFLAGS=-L$(LIBRARYPATH) -l$(LIBNAME) #库选项 TARGET=app # 程序名 INSTALLPATH=/usr/bin/ RM=sudo rm -rf MV=sudo mv
SRCFILE=$(wildcard *.c)
DESFILE=$(patsubst %.c, %.c, $(SRCFILE))
$(TARGET):$(DESFILE)
CC $^ -o $@
%.o:%.c
CC $(CFLAGS) $<
.PHONY:clean install distclean
clean:
$(RM) (DESFILE)
$(RM) $(TARGET)
install:
$(MV) $(TARGET) $(INSTALLPATH)
distclean:
$(RM) $(INSTALLPATH)$(TARGET)
原文:https://www.cnblogs.com/xkDiogt/p/13544982.html