Linux驱动学习:MakeFile

以下基于韦东山老师的Linux应用基础之Makefile

初识

  1. b.o : b.c:表示,b.o依赖于b.c,当b.c有改动(即时间产生了变化)时,就会运行gcc -c -o b.o b.c
  2. gcc -c 表示只进行编译,而不进行链接
test : b.o a.o
    gcc -o test a.o b.o
b.o : b.c
    gcc -c -o b.o b.c 
a.o : a.c
    gcc -c -o a.o a.c 

语法

  1. :=:定义即时变量,A:=$(C)在定义时就马上去找,如果在当前行往上没有这个变量,则为空
  2. =:定义延时变量,会在使用的时候去寻找C
  3. +=:拼接字符串
  4. ?=:如果这个变量是第一次定义,那么就赋值,如果不是,则不赋值
  5. $^:表示所有依赖文件,即冒号后面的文件
  6. %:通配符,类似于ls *中的*
  7. $@:表示目标
  8. $<:表示第一个依赖文件
  9. .PHONY:表示假象目标,是为了解决防止路径下有一个名称为all文件,导致make all无法运行的问题
A := $(C)
B = $(C)
C = 123
C += 456
D = 789
D ?= qwe

test : b.o a.o
    gcc -o test $^
%.o : %.c
    gcc -c -o $@ $< 

all:
    @echo ${A}
    @echo ${B}
    @echo ${C}
    @echo ${D}

clean:
    rm test
.PHONY: clean

函数

  1. $(foreach f,%(A),$(f).o):对列表A中的每一个元素,都将其赋为xxx.o的形式,类似于循环
  2. $(fileter %/, $(C)):到C中寻找符合%/格式的值
  3. $(fileter-out %/, $(C)):到C中寻找不符合%/格式的值
  4. $(wildcard *.c):在当前目录下,寻找所有*.c文件
  5. $(wildcard $(files2)):在当前目录下,寻找所有存在于files2列表中的文件
  6. $(patsubst %.c,%.d,$(files2)):将files2中符合%.c的文件替换为%.d

%为通配符,类似于Linux中的*

A = a b c
B = $(foreach f,$(A),$(f).o)

C = a b c d/
D = $(fileter %/, $(C))
E = $(fileter-out %/, $(C))

files = $(wildcard *.c)

files2 = a.c b.c c.c d.c e.c
files3 = $(wildcard $(files2))

dep_files = $(patsubst %.c,%.d,$(files2))

all:
    @echo B = $(B)
    @echo D = $(D)
    @echo E = $(E)
    @echo files = $(files)
    @echo file3 = $(files3)
    @echo dep_files = $(dep_files)

实例

  1. CFLAGS = -Werror:选项变量,存放一些gcc的选项,除了-Werror外还可以存放-I
  2. -MD:自动生成依赖文件
  3. -MF .$@.d:自动生成的依赖文件的名称
  4. ifneq ($(dep_files),):判断dep_files所包含的文件是否为空
  5. include $(dep_files):类似于C语言中的#include
objs = a.o b.o c.o

dep_files := $(patsubst %,.%.d,$(objs))
dep_files := $(wildcard $(dep_files))

CFLAGS = -Werror

test:$(objs)
        gcc -o test $^
ifneq ($(dep_files),)
include $(dep_files)
endif

%.o : %.c
        gcc $(CFLAGS) -c -o $@ $< -MD -MF .$@.d

distclean:
        rm $(dep_files)

clean:
        rm *.o test

.PHONY:clean
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值