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中加入
export CC
cd chat; $(MAKE) $(MFLAGS) all
就能将CC环境变量向 chat目录的同名环境变量传入指定的值
原文链接:https://blog.csdn.net/wh1312142954/article/details/90763934 (多级目录。多级多目标目录编译)