1.makefile中会常见的通配符一类的特殊符号组成的命令比如 $@ $^

例子

%.o:%.cpp (同 ".c.o"这样的旧规范用法 )
$(C_COMPILER) $< -c -o $@ $(CFLAGS)

这段命令意思

是生成所有.o文件依赖于对应的所有的.cpp ;

编译时生成的目标文件($@)依赖于第一个依赖的文件($<) 

还有所有依赖的文件($^)

2. 依赖关系符号 ":"

  用于描述依赖关系,$(OBJ):$(SRC)

3. 赋值操作

   " = " 单次赋值,如果后面再次对同一个变量赋值,上一次的值会被刷掉,但是无论在makefile的哪个位置使用,都是展开后的最终值

   " := " 类似 " = " ,不同的地方是和变量赋值的位置有关,非展开后的最终值

   "+=" 追加,在前面已经赋值的变量中追加值

 

" = "和 " := "区别从网上找的简单例子

      1、“=”

      make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。看例子:

            x = foo
            y = $(x) bar
            x = xyz

      在上例中,y的值将会是 xyz bar ,而不是 foo bar 。

      2、“:=”

      “:=”表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。

            x := foo
            y := $(x) bar
            x := xyz

      在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。
   原文地址: https://www.cnblogs.com/wanqieddy/archive/2011/09/21/2184257.html

4.实战,编译多级目录并且下级目录没有makefile的,可以参考下面

.PHONY:clean

CC=gcc
CFLAGS= -Wall -g

BIN=main_exe
ROOTSRC=$(wildcard *.c)
ROOTOBJ=$(patsubst %.c, %.o, $(ROOTSRC))
SUBDIR=$(shell ls -d */)
SUBSRC=$(shell find $(SUBDIR) -name '*.c')
SUBOBJ=$(SUBSRC:%.c=%.o)

$(BIN):$(ROOTOBJ) $(SUBOBJ)
  $(CC) $(CFLAGS) $^ -o $@

%.o:%.c
  $(CC) $(CFLAGS) -c $< -o $@

clean:

  rm -rf $(BIN) $(ROOTOBJ) $(SUBOBJ)

上面列出全部的.o(SUBOBJ中保存),然后再%.o:%.c根据依赖关系生成所有的.o,最终生成BIN

 

5.如果是多级目录,并且想在最上层目录配置好的环境变量在下级也能使用

 在主makefile中加入

CC=arm-linux-gcc
export CC
 
all:
     cd chat; $(MAKE) $(MFLAGS) all

就能将CC环境变量向 chat目录的同名环境变量传入指定的值
原文链接:https://blog.csdn.net/wh1312142954/article/details/90763934 (多级目录。多级多目标目录编译)

 

posted on 2020-04-09 18:05  kasader  阅读(481)  评论(0编辑  收藏  举报