Makefile多个子文件夹

首先,目录结构:

其中根目录Makefile主要作用是调用其他子文件夹Makefile,每个子模块执行各自编译后在build文件夹下生成obj文件,最后再执行build文件夹下Makefile进行链接。

根目录Makefile:


TARGET = ACT_Drv
##

SRC_DIR=src
BUILD_DIR=build
LIB_DIR=lib
INTERFACE_DIR 	= $(SRC_DIR)/Interface
ACT_DRIVER_DIR 	= $(SRC_DIR)/Act_Driver
CURRENT_DIR 	=$(SRC_DIR)/Current_Loop

##
CC=gcc


all:
	make -C $(ACT_DRIVER_DIR)
	make -C $(CURRENT_DIR)
	make -C $(INTERFACE_DIR)
	make -C $(BUILD_DIR)

任意子文件夹Makefile:

OUTPUTDIR = ../../build
TARGET = $(OUTPUTDIR)/Current_Loop.o
CC := gcc


SRC = $(wildcard *.c)
OBJ = $(patsubst %.c,$(OUTPUTDIR)/%.o,$(notdir $(SRC)))

$(TARGET):$(SRC)
	$(CC) -c $< -o $@

以其中一个为例,SRC通过wildcard *.c查找所有c文件,然后通过patsubst讲*.c替换为.o文件,而后通过notdir去掉路径后将obj文件放到../../build文件夹。

$@目标文件

$< 第一个依赖项

$^所有依赖

-c仅编译不链接。因为有的文件是需要其他模块功能,有的还需要进行动\静态库链接,这里先编译等到最后得到全部obj文件后再链接。如果需要头文件可以通过-I../inc指定包含目录。

每个子模块通过上面Makefile文件进行编译后得到obj文件,最后通过一个Makefile进行链接:

TARGET = ../ACT_Drv

CC := gcc

OBJ = $(wildcard *.o)

LIBS = -L../lib -lACTS2200_64

$(TARGET):$(OBJ)
	$(CC) $^ -o $@ $(LIBS)

-L指定文件夹 -l库名

Makefile是一种用于编译和构建程序的自动化工具,它使用一种名为make的程序来控制编译过程。在Makefile中,您可以定义一系列的规则来说明如何编译和链接程序中的各个文件。当您需要编译多个C源文件时,可以在Makefile中创建一个规则,指定如何将这些C文件编译成目标文件(.o),然后链接成最终的可执行文件。 以下是一个简单的Makefile示例,它展示了如何编译多个C源文件: ```makefile # 定义编译器 CC=gcc # 定义编译选项 CFLAGS=-Wall # 定义目标可执行文件名 TARGET=your_program # 定义源文件列表 SRCS=main.c utils.c math.c # 定义目标文件列表,由源文件通过替换后缀得到 OBJS=$(SRCS:.c=.o) # 默认目标 $(TARGET): $(OBJS) $(CC) $(CFLAGS) -o $(TARGET) $(OBJS) # 每一个.c文件对应一个.o文件的规则 %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ # 清理编译生成的文件 clean: rm -f $(OBJS) $(TARGET) # 声明伪目标 .PHONY: clean ``` 在这个Makefile中: - `CC` 变量定义了使用的编译器,这里使用的是 `gcc`。 - `CFLAGS` 变量定义了编译选项,这里使用的是 `-Wall` 来开启所有警告。 - `TARGET` 变量定义了最终生成的可执行文件名。 - `SRCS` 变量定义了源文件的列表。 - `OBJS` 变量通过替换 `.c` 后缀为 `.o` 来生成目标文件列表。 - 默认目标依赖于 `$(OBJS)`,当所有的 `.o` 文件是最新的,或者没有任何 `.c` 文件更改过,make命令默认执行的规则将不会执行任何操作。 - `%.o: %.c` 规则说明了如何将每个 `.c` 文件编译成对应的 `.o` 文件。 - `clean` 目标用于删除所有编译生成的文件,这是一个伪目标,因为它的名字不对应于一个实际的文件名。 - `.PHONY` 声明告诉make,`clean` 是一个伪目标,确保每次执行 `make clean` 都会运行。 使用这个Makefile,您可以简单地运行 `make` 命令来编译您的程序,或者使用 `make clean` 来清理编译生成的文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值