您可以在这里看到我的Makefile:
....
PHY_SRCS = ../LwMesh/phy/at86rf212/src/phy.c
HAL_SRCS = ../LwMesh/hal/atmega1281/src/hal.c ../LwMesh/hal/atmega1281/src/halPhy.c ../LwMesh/hal/atmega1281/src/halTimer.c
SYS_SRCS = ../LwMesh/sys/src/sys.c ../LwMesh/sys/src/sysEncrypt.c ../LwMesh/sys/src/sysTimer.c
....
# define the C object files
PHY_OBJS = $(PHY_SRCS:.c=.o)
HAL_OBJS = $(HAL_SRCS:.c=.o)
....
# define the executable file
PHY = phy_cc
HAL = hal_cc
SYS = sys_cc
.....
OBJDIR := obj
$(OBJDIR):
mkdir $(OBJDIR)
all: $(PHY) $(HAL) $(SYS) $(DRV) $(NWK) $(SRV) $(VELA)
@echo Alles wurde Kompiliert
$(PHY): $(PHY_OBJS)
$(CC) $(CFLAGS) $(INCLUDES) -o $(PHY) $(PHY_OBJS) $(LFLAGS)
$(HAL): $(HAL_OBJS)
$(CC) $(CFLAGS) $(INCLUDES) -o $(HAL) $(HAL_OBJS) $(LFLAGS)
....
.c.o:
$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
...
我已经尝试过多地将自动生成的文件(例如目标文件)放置在单独的目录(OBJDIR)中,但是没有找到任何解决方案。
我提到了this tutorial,但它不适用于我的Makefile。
请你帮助我好吗?
最佳答案
让我们一步步来做。
您已经有了构建目标文件的规则:
.c.o:
$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
可以写成:
%.o: %.c
$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
这将使用
../LwMesh/phy/at86rf212/src/phy.c
构建../LwMesh/phy/at86rf212/src/phy.c
。但是请想象一下phy.c
在工作目录中。然后Make可以使用该规则从phy.o
构建phy.c
。在这种情况下,我们可以对规则进行一些小的更改:$(OBJDIR)/%.o: %.c
$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
和Make将构建
obj/phy.o
。我们如何告诉Make在哪里找到
phy.c
?有两种好的方法。一种是使用vpath:vpath %.c ../LwMesh/phy/at86rf212/src
确认此方法可行后,我们可以为其他对象集添加其他目录(例如
PHY
和SYS
):vpath %.c ../LwMesh/phy/at86rf212/src ../LwMesh/hal/atmega1281/src ../LwMesh/sys/src ...
现在,我们要做的就是正确构造对象列表:
PHY_OBJS = phy.o
HAL_OBJS = hal.o halPhy.o halTimer.o
SYS_OBJS = sys.o sysEncrypt.o sysTimer.o
...
一旦这些工作正常,就可以进一步完善。
关于makefile - Makefile : How to place auto-generated files in a separate directory?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50695146/