Makefile学习 -4 多个Makefile编写

学习目标

掌握多个Makefile文件嵌套编译。包括:

如何将.o文件放到指定路径

符号export

嵌套依赖:精髓在于$(SUBDIR):ECHO、make -C $@

了解@echo作用。

 

总结

 对于大型工程,每个源文件需要单独编译,对应一个Makefile。最后需要把所有源文件生成的.o文件编译成可执行文件。中间的.o文件一般放到一个指定目录下,比如obj文件夹。最后将生成的可执行文件放到bin文件夹下。

 

正文

 1- 文档结构

ls -R可以看到文件结构。根目录下有一个总的Makefile文件;4个文件夹:include(head.h)、main(main.c Makefile)、obj(Makefile)、test1(test1.c  Makefile)。

2- 代码

a- ./include

/*/include/head.h*/
extern int test1(void);

b- ./test1

Makefile文件说明:OBJ_DIR在根Makefile中有定义。这个Makefile是编译test1.c文件,将test1.c文件输出到../obj/目录下,也就是根目录/obj

/*/test1/test1.c*/
#include<stdio.h>
int test1(void)
{
    printf("func:%s  \n",__func__);
    return 0;
}
../$(OBJ_DIR)/test1.o:test1.c
	$(CC) -c $^ -o $@

c- ./main

Makefile说明:同test1,编译main.c将生成的main.o放到根目录/obj/路径下

/*/main/main.c*/
#include<stdio.h>
#include"head.h"
int main(void)
{
    printf("func:%s begain\n",__func__);
	test1();
    printf("func:%s end\n",__func__);
	
	return 0;
}
../$(OBJ_DIR)/main.o:main.c
	$(CC) $(CFLAGS) $+ -o $@

d- ./obj路径下Makefile

主要是将前几步生成的test1.o、main.o编译成可执行文件myapp,并将其放到根路径/bin

../$(BIN_DIR)/$(BIN):$(OBJ)
	$(CC) $^ -o $@ 

e- 根目录的Makefile(重点)

说明:

I- export之前是定义变量。SUBDIRS表示根目录下的文件夹有哪些;CFLAGS表示编译参数,后面在生成main.o会用到;OBJ表示中间生成的.o文件,OBJ_DIR表示中间生成的.o文件路径;BIN表示生成的可执行文件名,BIN_DIR表示可执行文件的路径;

II- export关键字表示ii将这些符号extern,其他的Makefile可以使用。

III- all依赖CHECK_DIR $(SUBDIRS)。

先用到CHECK_DIR。该定义为mkdir -p bin,即新建bin文件夹。

然后用到$(SUBDIRS)。SUBDIRS依赖ECHO. ECHO首先打印SUBDIRS,即打印test1 main obj;begin compile。然后执行make -C $@,此时@分解为test1、main、obj。即分别执行make -C /test1/、 make -C /main/、make -C /obj/,即执行这几个路径下的Makefile文件。最终生成可执行文件。

IV- CLEAN。清除。/obj/路径下所有的.o文件、删除./bin/文件及其内文件。

精髓在于$(SUBDIR):ECHO、make -C $@

#Makefile
CC=gcc
SUBDIRS=test1 \
		main \
		obj
CFLAGS=-c -Wall -I ../include
OBJ=test1.o main.o
BIN=myapp
OBJ_DIR=obj
BIN_DIR=bin
export CC CFLAGS OBJ BIN OBJ_DIR BIN_DIR

all:CHECK_DIR $(SUBDIRS)
CHECK_DIR:
	mkdir -p $(BIN_DIR)
$(SUBDIRS):ECHO
	make -C $@
ECHO:
	@echo $(SUBDIRS)
	@echo begin compile

CLEAN:
	@$(RM) $(OBJ_DIR)/*.o
	@rm -rf $(BIN_DIR)

附:

@echo加@,直接打印输出内容,不打印命令。如果不加@则打印echo 命令,然后打印输出内容。

不加@:

加@:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值