makefile制作和逐步推进过程

来源:互联网 发布:ug8.5数控编程视频教程 编辑:程序博客网 时间:2024/05/16 01:54

makefile制作和逐步推进过程(一起学习吧)

优点 1开发效率 2编译速度

基本格式

target ... : prerequisites ...    command    ...    ...
  • target 目标文件, 可以是 Object File, 也可以是可执行文件,$@
  • 生成target所需要的文件或者目标依赖项,<^
  • make需要执行的命令 (任意的shell命令), Makefile中的命令必须以 [tab] 开头
  • 隐晦规则,变量定义,文件指示 :: Makefile中引用其他Makefile 注释

通配符

  • * :: 表示任意一个或多个字符
  • ? :: 表示任意一个字符
  • […] :: [abcd] 表示a,b,c,d中任意一个字符, [^abcd]表示除a,b,c,d以外的字符, [0-9]表示 0~9中任意一个数字
  • ~ :: 表示用户的home目录

推演例子

#文件名需:makefile all: a.out  #首先依赖a.out: main.o hello.o    gcc  main.o hello.ohello.o: hello.c    gcc -c hello.cmain.o: main.c    gcc -c main.c

变量使用

  • allobj := main.o hello.o (:=和=的区别 :=是立即赋值 =要用时展开类define)
  • 内置特殊变量:
    1. $@表示目标文件
    2. $<表示第一个依赖文件
    3. $*
    4. $%
    5. $^表示所有的依赖文件,
    6. $?
    7. $+
allobj := main.o hello.oall: a.outa.out: $(allobj)    gcc  $^ hello.o: hello.c    gcc -c hello.cmain.o: main.c    gcc -c main.c

缺省规则

xxx.o自动依赖xxx.c 没有依赖.h不好使用

allobj := main.o hello.oall: a.outa.out: $(allobj)    gcc  $^ 

makefile执行shell命令

target := hello.outallobjc := $(shell ls *.c) #赋值所有.c文件allobj := $(allobjc:.c=.o) #把.c文件修改.o文件all: $(target)$(target): $(allobj)    gcc -o $@  $^

头文件的依赖

gcc -MM 自动寻找.o文件依赖所有.h文件 gcc -MM a.c >a.d 文件内容 a.o:a.c xx.h xxx.h

target := hello.outallobjc := $(shell ls *.c)allobj := $(allobjc:.c=.o)alldep := $(allobjc:.c=.d)CC := gccall: $(target) #注意放的位置# %为通配符%.d: %.c     $(CC) -MM $< > $@-include $(alldep)# include main.d 文件内容# main.o: main.c hello.h# makefile会合并上下两句为 mian.o: main.c hello.h# mian.o: main.c%.o: %.c    $(CC) -c $<$(target): $(allobj)    $(CC) -o $@  $^

使用make clean

一般放在文件最后

.POHONY clean:    -rm *.o *.d $(target) 

方便使用的方法

makefile包含makefile

作用可把经常变动的变量个一个文件里,方便管理

-include define.mk #include相当于define拷贝过来,-当include的文件不存在忽略

测试makefile变量和命令

#测试输出变量test:    echo $(allobj)#命令本身会输出 可以加@不输出 echo 会输出两次所以加@%.o: %.c    @echo "%.o:%.c"    $(CC) -c $<

其他

  • 获取目录下的.c 和转换成.o的其他方法
comm_path = ./comsrc := $(wildcard $(comm_path)/*.c)obj := $(patsubst $(comm_path)/%.c,$(comm_path)/%.o,$(src))
  • 多个目标 \分隔
target := a.out \ b.out
  • 以后补
clearn:    -rm ... ...distclean:    -rm ... ....PHONY:clean ALL distclean
0 0