我有一个具有此层次结构的程序:
-| base folder
- - main.c
- - Makefile
- -| motor control
- - - controller.c
- - - controller.h
- -| Build-Assets
- - - Makefile.Release
这样做的目的是清理main.c
.
在controller.c
中,我基本上添加了另一层抽象来处理最终的错误并隐藏处理直行等的所有逻辑。
我想知道如何编写 makefile 以首先编译电机控制,然后编译main.c
.
这是我正在使用的代码(老实说,我对第二个代码不太了解,我从我正在处理的项目的"入门"页面获取了它)
生成文件
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)
以下是修改生成文件的方法。
此行控制制作哪些 .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
必须已存在。