对如何在Makefile中包含/编译依赖项感到困惑

时间:2019-01-19 19:14:32

标签: c makefile

我有一个具有以下层次结构的程序:

-| base folder
- - main.c
- - Makefile
- -| motor control
- - - controller.c
- - - controller.h
- -| Build-Assets
- - - Makefile.Release

这样做的目的是清理main.c

controller.c中,我基本上是添加了另一层抽象来处理最终的错误并隐藏处理直线行驶等的所有逻辑。

我想知道如何编写makefile来首先编译电动机控制,然后编译main.c

这是我正在使用的代码(老实说,我对第二个代码不太了解,我从我正在研究的项目的“入门”页面上获取了它)

Makefile

MAKEFILE_BASE = ./Build-Assets/Makefile

.PHONY: default clean release release-clean

default: release

clean: release-clean

release:
    $(MAKE) -f $(MAKEFILE_BASE).Release

release-clean:
    $(MAKE) -f $(MAKEFILE_BASE).Release clean

Makefile.Release

TARGET = $(notdir $(shell pwd))

LIBS = -lm -lev3dev-c
D_BIN = Build-Assets

ifeq ($(OS),Windows_NT)
LIBS := $(LIBS) -lws2_32
D_BIN := $(D_BIN)/mingw
endif

D_H = ../../source/ev3
CFLAGS = $(addprefix -I, $(D_H)) -O2 -std=gnu99 -W -Wall -Wno-comment

ifeq ($(OS),Windows_NT)
CC = gcc
else
CC = arm-linux-gnueabi-gcc
endif

ifeq ($(OS),Windows_NT)
E_BIN = .exe
else
E_BIN =
endif

F_BIN = $(TARGET)$(E_BIN)

OBJECTS = $(addprefix $(D_BIN)/, $(patsubst %.c, %.o, $(wildcard *.c)))

.PHONY: default all clean

default: $(F_BIN)
all: default

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

.PRECIOUS: $(F_BIN) $(OBJECTS)

$(F_BIN): $(OBJECTS)
    $(CC) $(OBJECTS) -Wall $(LIBS) -o $@

clean:
    -rm -f $(D_BIN)/*.o
    -rm -f $(F_BIN)

1 个答案:

答案 0 :(得分:0)

这是修改Makefile的方法。

此行控制生成的.o文件:

OBJECTS = $(addprefix $(D_BIN)/, $(patsubst %.c, %.o, $(wildcard *.c)))

$(wildcard *.c)部分与顶级目录中的所有.c文件匹配。这将与任何其他目录中的.c文件都不匹配。

将其更改为此:

OBJECTS = $(addprefix $(D_BIN)/, $(patsubst %.c, %.o, $(wildcard *.c motor/*.c)))

({motor应该是电动机控制器子目录的名称。)

请注意,如果您有motor/controller.c,Makefile将尝试构建它并将其放入Build-Assets/motor/controller.o中。为此,目录Build-Assets/motor必须已经存在