makefile总结

1.make自动寻找makefile或者Makefile文件
   或者make -f  mymake.mk
   make -I  /home/danae/......   #include 会在这个目录下寻找
2.第一个目标文件作为最终生成文件
3. .PHONY:clean         #伪目标
    clean:
    -rm edi $(objects)    #忽略错误
4.命令必须以<TAB>开头,以@开头,不打印命令,直接执行
           @echo $(DIR)
5. 包含其他的makefile文件
    -include foo.make    a.mk  b.mk c.mk   #如果在指定目录下没有找到,仍然会执行下面的命令
6.vpath %.c foo:bar
   vapth % blish   #.c结尾的文件现在foo目录,然后bar,然后blish目录寻找
7.自动化变量
   $@:目标集
   $<:依赖目标集
   需要理解:
    objects = foo.o     bar.o
   $(objects):%.o:%.c  # $(filter %.o, $(objects)):%.o:%.c
   $(CC) -c $(CFLAGS) $<  -o $@ 
8.自动生成依赖关系:根据.c文件中的include“”,找到依赖关系,在.d文件中保存。
  例如:
  gcc -M main.c # cc-MM main.c 不包含标准库头文件
  输出main.o:main.c defs.h
9.关于命令执行
  cd /usr/local; pwd #在一行写
10.总控makefile,每个子目录下面还有一个makefile,通常要传输变量过去
   用法:
   subsystem:
    BUILD_OPTIONS = "POCO_LIB_DIR=$(POCO_LIB_DIR)"
    BUILD_OPTIONS +="COMMON_INC_DIR=$(COMMON_INC_DIR)"
   $(MAKE) -C subdir $(BUILD_OPTIONS)  #BUILD_OPTIONS中放变量,首先进入subdir目录下,再执行make
11.对于相同的命令,用#define定义命令包
   用法:
   define run-yacc
   yacc $(firstword $^)  # $^代表foo.y?????????
   mv y.tab.c $@
   endef
   调用命令 : $(run-yacc)
12.变量定义的三种方法区别
     1.name = bar    $(NAME)
     2.NAME := bar  $(NAME)
     3.NAME?=bar
13. 变量值的替换
     用法:
     foo := a.o b.o c.o
     bar := $(foo:%.o=%.c)
14.判断ifeq  空格
     用法:#根据不同的编译方式,使用不同的库
     f oo:$(objects) 
     ifeq ($(CC),gcc)
         $(CC) -o foo $(objects) $(libs_for_gcc)
     else
         $(CC) -o foo $(objects) $(normal_libs)
15.自带函数的使用-字符串处理函数
     1)subst-字符串替换
        $(subst <from>,<to>,<text>)
       $(subst ee, EE, feet on the street)
      2)strip--去空格函数
         $(strip <text>)
         $(strip a b c )
     3)findstring--在in中找find字符串
        $(findstring <find>,<in>)
        $(findstring a, a b) #返回a
         $(findstring a, b c) #返回空
     4)filter--过滤
         $(filter <pattern>,<text>)
        sources := foo.c  bar.c baz.s ugh.h
         foo : $(sources)   #格式 : 目标项:依赖项
         cc $(filter %.c %.s $(sources)) -o foo
      5)sort--会去掉相同单词
         $(sort foo bar lose)
       6)word--去第几个单词
         $(word <n>,<text>)
         $(word 2, a b c)  #返回b
     7)wordlist
            $(wordlist 2, 5,a b c d e f g h)  #返回b c d e          
     8)words-统计单词的个数
          $(words,a b c d e f g h)  #返回  8

16. 自带函数的使用-文件名操作函数
    1)dir--路径
        $(dir /home/danae/a.c  b.cpp)  -->/home/danae  ./ 
    2)notdir--文件名
         $(notdir /home/danae/a.c  b.cpp)  -->a.c  b.c 
    3)suffix--文件名后缀
          $(suffix /home/danae/a.c  b.cpp)  -->.c   .cpp
    4)basename--除去后缀
          $(basename /home/danae/a.c  b.cpp)  -->/home/danae/a  b 
    5)addsuffix--加后缀
          $(addsuffix .c /home/danae/a  b)  -->/home/danae/a.c  /home/danae/b.c 
    6)addprefix--加前缀路径
           $(addprefix /home/danae/  a.c b.cpp)  -->/home/danae/a.c  /home/danae/b.cpp 
    7)join--联合字符串
         $(join /home/danae/  ./  a.c b.cpp d.p)  -->/home/danae/a.c  ./b.cpp  d.p  #多对多
17.foreach循环
18.if函数
19.call函数
20.origin函数
21.shell函数
files := $(shell echo *.c)
22.编译C隐含规则
23.编译C++隐含规则
  24.命令的变量
CC:cc
CXX:g++
CPP:$(CC) -E
25.命令参数的变量
  26.自动化变量
$@:
$%:
$^:
$<:



































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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值