您可以在这里看到我的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

确认此方法可行后,我们可以为其他对象集添加其他目录(例如PHYSYS):
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/

10-12 14:56