在实践中学习makefile

1.编译a.c b.c c.c

all:a.o b.o c.o

a.o:a.c

 gcc -c a.c

b.o:b.c

 gcc -c b.c

c.o:c.c

 gcc -c c.c


2.静态模式编译a.c b.c c.c

objs = a.o b.o c.o

all:$(objs)

$(objs):%.o:%.c

 gcc -c $< -o $@

(注:这里的$<指第一个依赖文件,$@指目标文件)

该条语句是用变量objs中的值一个个来匹配两个冒号中间的(也即是%.o),满足了,就抽取%来和后面的%.c组成新的.c文件。构成一条规则。


3.将当前目录下的所有.c编译成对应的.o(.o还是放在当前路径)

objs = $(shell find . -maxdepth 1 -name '*.c')#注:这里的shell指调用shell命令,返回值最为objs的值。find是shell的一个命令“.”指当前路径,-maxdepth 1指当前目录下搜索时,往下层目录的层数,1就是仅在当前目录下找,不继续去当前目录的子目录下搜索。‘*.c’表示要怎么匹配。

all:$(objs)

$(objs):%.o:%.c

 gcc -c $< -o $@


4.将当前目录下的所有.c编译成对应的.o(.o还是放在指定的路径)

CURRENT_BUILD_PATH = /home/root/my_makefile/#这里可以随意指定。

CURRENT_DIR_FILE = $(shell find . -maxdepth 1 -name '*.c')
SPACE =
CURRENT_PREFIX = ./
FILE_NAME = $(subst $(CURRENT_PREFIX),$(SPACE), $(CURRENT_DIR_FILE))
BUILD_OBJS = $(addprefix $(CURRENT_BUILD_PATH), $(FILE_NAME))
BUILD_OBJS := $(patsubst %.c,%.o,${BUILD_OBJS})


#注:BUILD_OBJS变量中,就是 CURRENT_BUILD_PATH 路径和FILE_NAME 组合在一起。如得到

/home/root/my_makefile/a.o , 为什么要得到这个呢?因为这是我们要生成的文件和存放路径。

其中FILE_NAME = $(subst $(CURRENT_PREFIX),$(SPACE), $(CURRENT_DIR_FILE))这一句是将find找打的文件中的前面的"./"去掉。因为我们要和文件路径前缀连接起来。不能有./

后面两句分别是添加前缀和将.c替换成.o

all:$(BUILD_OBJS)

$(BUILD_OBJS):$(CURRENT_BUILD_PATH)%.o:%.c

 @$(CC) -DHAVE_CONFIG_H $(CFLAGS) -c `test -f '$<' || echo `$< -o $@

 #注:这里利用静态模式就直接可以将当前目录下的.c生成指定目录下的.o


5.将指定目录下的.c编译生成指定目录下的.o

 在makefile中,make -C $(path) all 这样一个规则中的命令,就会进入path这个路径中执行该路径下的makefile。所以,要将指定目录下的.c生成指定目录下的.o一般没有这种需求。直接进入该目录执行该目录下的makefile


6.当发现各个目录下的makefile的规则大多都一样(也就是写得很通用了),不想每个makefile文件都写统一的一段makefile。一般来说会想封装成函数。但是makefile中不需要封装成函数,只需要使用include就好了,类似c语言中的宏的使用。

 具体如下:

 (1)创建一个Makefile.rules文件。将自己通用的那段代码拷贝到这个文件保存。

 (2)在每个Makefile文件中,要用到这段makefile的地方,直接include "xxx/Makefile.rules"就好了。

 注:这个类似宏替换,include后,相当于将Makefile.rules中的代码拷贝过来放在include处。所以在此文件下定义的变量,Makefile.rules中也能使用。

7.


猜你喜欢

转载自blog.csdn.net/qq1319713925/article/details/79288080