makefile的基础实使用

makefile

  • 作用:进行项目的管理
  • makefile的文件名:必须是"makefile"或者“Makeile”
makefile的规则

​ 语法:

目标:依赖条件
(一个tab缩进)命令
  • 目标的时间,必须晚于依赖条件的时间,否则,更新目标。
  • 依赖条件,如果不存在,寻找新的规则去产生依赖条件
test:test.o add.o sub.o
        g++ test.o add.o sub.o -o test
test.o:test.cpp
        g++ -c test.cpp -o test.o
add.o:add.cpp
        g++ -c add.cpp -o add.o
sub.o:sub.cpp
        g++ -c sub.cpp -o sub.o
2个函数
wukdcard函数:

src = $(wildcard ./*.c) :匹配当前目录下所有的.c文件,然后将文件名组成列表,赋值给变量src

patsubst函数:
obj = $(patsubst %.c, %.o, $(src)) :将参3中,包含参1的部分替换为参2.
相当于: obj = add.o sub.o
src = $(wildcard *.cpp)
obj  = $(patsubst %.cpp, %.o,$(src))
test:$(obj)
        g++ $(obj) -o test
test.o:test.cpp
        g++ -c test.cpp -o test.o
add.o:add.cpp
        g++ -c add.cpp -o add.o
sub.o:sub.cpp
        g++ -c sub.cpp -o sub.o

3个自动变量

普通变量

  • 定义变量语法:变量名 = 变量值 (都是字符串)

    举例: foo = abc

  • 取变量值语法:$(变量)

    举例: bar = $(foo) ===> bar=abc

自动变量

  • $@:在规则的命令中,表示规则的目标
  • $^:在规则的命令中,表示所有依赖条件。
  • $<:在规则的命令中,表示第一个依赖条件。在模式规则中,将依赖列表中的每一个依赖依次取出,套用模式规则。
src = $(wildcard *.cpp)
obj  = $(patsubst %.cpp, %.o,$(src))
test:$(obj)
        g++ $^ -o $@
test.o:test.cpp
        g++ -c $< -o $@
add.o:add.cpp
        g++ -c $< -o $@
sub.o:sub.cpp
        g++ -c $< -o $@
其他关键字
  • ALL:用来给makefile文件,指定“终极目标”。

    • makefile文件,默认规则为:自上而下,碰到的第一个规则中的目标就是终极目标。
  • clean:用来借助makefile清除项目中的指定文件,如*.o

    • 举例:

      clean: # 没有依赖条件
      	-rm -rf $(obj) a.out
      
      ALL:test
      
      src = $(wildcard *.cpp)
      obj  = $(patsubst %.cpp, %.o,$(src))
      test:$(obj)
              g++ $^ -o $@
      test.o:test.cpp
              g++ -c $< -o $@
      add.o:add.cpp
              g++ -c $< -o $@
      sub.o:sub.cpp
              g++ -c $< -o $@
      clean:
              rm -rf $(obj) test
      
      
模式规则
  • 可以将makefile文件中,具有严格统一格式的规则,使用模式规则代替,只能使用$<符号.

    %.o:%.cpp
    	g++ -c $< -o $@
    
  • 静态模式规则:

    将模式规则,指定给一个变量使用

    $(obj):%.o:%.cpp
            g++ -c $< -o $@xxxxxxxxxx $(obj):%.o:%.cpp        g++ -c $< -o $@$(obj):%.o:%.c        gcc -c $< -o $@
    
    伪目标

    针对,残缺的规则,使之也能生成目标.

    .PYTHON:clean ALL
    

    其他参数

  • -n:模拟指定makefile,不真正执行,推荐首次使用makefile使用。

  • -f:指定命名非"makefile"的文件 make -f makefile2

完成版本
target = $(test)
ALL:target

src = $(wildcard *.cpp)
obj  = $(patsubst %.cpp, %.o,$(src))

CC = g++
target:$(obj)
        $(CC) $^ -o $@

$(obj):%.o:%.cpp
        $(CC) -c $< -o $@
clean:
        -rm -rf $(obj) target
.PHONY:clean ALL

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值