//main.c
#include <stdio.h>
#include "complicated.h"int main(){printf("%sn",HELLO_STRING);printf("%sn",PROJECT_NAME);complicated();return 0;
}
//complicated.h
#ifndef __COMPLICATED_H__
#define __COMPLICATED_H__#define HELLO_STRING "hello !"
#define PROJECT_NAME "complicated"extern void complicated(void);#endif
//complicated.c
#include <stdio.h>
#include "complicated.h"void complicated(void){printf("This is a %s project!n",PROJECT_NAME);
}
# 描述:complicated 项目 makefile文件
# 版本:v1.5
# 修改记录:
# 1. 为complicated项目makefile添加注释
# 2. 使用变量改进我们complicated项目的makefile
# 3. 使用静态模式规则,简化makefile
# 4. 使用伪目标,加上clean规则
# 5. 引进wildcard函数,自动扫描当前目录下的源文件
# 6. 加入自动规则依赖# 定义可执行文件变量
executbale := complicated
# wildcard函数扫描源文件,定义列表变量
# wildcard:列出符合*.c格式的文件名
sources := $(wildcard *.c)
# 使用变量的引用替换,定义object文件列表
objects := $(sources:.c=.o)
# 使用变量的引用替换,定义依赖描述文件列表
deps := $(sources:.c=.d)# 定义编译命令变量
CC := gcc
RM := rm -rf# 终极目标规则,生成complicated可执行文件
$(executbale): $(objects)
# 使用自动化变量改造我们的编译命令$(CC) -o $@ $^# 子规则, main.o和complicated.o的生成规则,使用静态模式规则
$(objects):%.o:%.c$(CC) -o $@ -c $<# clean规则
#.PHONY <伪目标>
.PHONY: clean
clean:$(RM) $(executbale) $(objects) $(deps)# 自动规则依赖
sinclude $(deps)$(deps):%.d:%.c$(CC) -MM $< > $@
终极目标:依赖A 依赖B 依赖C终极目标命令依赖A:子依赖A1 子依赖A2 依赖A命令依赖B:子依赖B1 子依赖B2 依赖B命令依赖C:子依赖C1 子依赖C2 依赖C命令
对整颗依赖树以从底到上,从左到右的顺序,解析执行每一条规则:
foo1 = $(bar) #递归展开式变量:变量被引用时求值
= 和:=区别:求值时机foo2 := $(bar) #直接展开式变量:变量被定义时求值bar = $(ugh)
ugh = Huh?all:echo "foo1 is $(foo1),foo2 is $(foo2)"
all:first second thirdecho "$$@ = $@" # $@ 代表规则中的目标文件名echo "$$< = $<" # $< 代表规则的第一个依赖的文件名echo "$$^ = $^" # $^ 代表规则中所有依赖文件的列表first second third:
本文发布于:2024-01-28 10:59:40,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17064107836941.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |