linux下makefile的编写

为什么需要makefile          

       在实际的开发中,源文件通常会不止一个,一个项目工程往往是分为多个模块,每个人去写不同的模块,最后整合在一起。但是如果我们仅仅只是使用gcc编译器来整合,这个过程是非常繁琐的。为了提高效率,往往会有一个或多个makefile.

什么是makefile

    `
在Linux中,有一个用来维护程序模块关系和生成可执行程序的工具-make,它可以根据模块的修改情况重新编译链接生成可执行的程序。而执行make命令,需要一个makefile文件,在makefile文件中定义了整个项目的编译规则,模块间的依赖关系,指定了文件的编译顺序,以及编译所使用的命令。

make如何解释执行makefile

       make首先在当前目录下寻找名为makefile的文件,找到文件后,然后去寻找目标文件,如果没有,则会去寻找依赖文件,然后会继续去寻找目标文件,没有,则继续重复该步骤,直到找到源文件,于是会执行相关的命令。该过程为一个逆向过程,由目标去推到出要执行的命令。
        如果某一个文件被修改过后,makefile会检查文件的时间,时间更新,会重新编译链接。

makefile的编写规则

        目标:依赖
                      执行命令

makefile文件的构成

    显示规则:指明目标文件,目标文件的依赖文件,生成目标文件的命令。
     隐式规则:由make根据目标文件自动推导出的规则,make根据目标文件的文件名,自动产生目标的依赖文件和生成的命令。(ex:name.o会自动推导出name.c)
   使用变量:Makefile中的变量类似于C语言中的宏,使用$name替换为相应的字符串。
        文件指示:类似于C语言中的条件编译和头文件的包含。
        注释:以#开头的语句。

makefile文件的自动变量

  $@:目标文件的集合。
    $^:目标文件的所有依赖文件的集合。
    $<:目标文件依赖文件的第一个文件。

makefile中的伪目标

  .PHONY:clean
    伪目标不要求生成实际的文件,而是为了让make执行一些辅助命令。

makefile文件中常使用的函数

    $(<function><arguments>)
字符串替换函数
    $(subst<from>,<to>,<text>)
把text中的内容<from>字符串替换为<to>字符串
    $(patsubst<pattern>,<replacement>,<text>)
查找text中的单词是否符合模式pattern,如果匹配的话,用replacement替换
    $(strip<string>)
去除空格函数去掉开头和结尾的空格 ex:$(strip a b c)
    $(findstring<find>,<in>)
查找字符串在in中查找find字串,返回查找的字串
      $(filter<pattern>,<text>)
过滤函数以pattern模式过滤text字符串中的单词,保留符合pattern模式的字串
  $(filter-out<pattern>,<text>)
去除符合模式的字串
    $(sort<list>)
排序函数 给字符串list中的单词排序(升序)ex:$(sort foo bar lose)
  $(word<n>,<text>)
取单词函数 取字符串text中的第n个单词 ex:$(word 4,hha jak ajhf afhk)
$(words<text>)
功能统计text中字符串的单词个数
$(firstword)
取text中第一个单词
$(suffix<names...>)
从文件名序列中取出各个文件名的后缀
$(basename<names..>)
前缀
$(addsuffix<suffix>,<names...>)
将后缀加入到names后面
$(join<list1>,<list2>)
把list2中的单词加到list1后面,如果单词个数list1>list2 list1保持不变,否则多出来的单词被复制到list2中
$(foreach<var>,<list>,<text>)
把参数list中的单词逐一取出放到var所指定的变量中,然后在执行text所包含的表达式
names:=a b c d
files:=$(foreach n,$(names),$(n).o)a.o b.o c.o d.o

makefile例子

  CC = gcc
CFLAGS = -g
APP = software
SRC = $(wildcard*.c)
OBJECTS = $(patsubst%.c,%.o,$(SRC))


$(APP):$(OBJECTS)
$(CC) $^ $(CFLAGS) -o $@
%.o:%.c
$(CC) -c $^ -o $@
.PHONY:clean
rm -rf *.o






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值