gpt4 book ai didi

makefile - Makefile : How to place auto-generated files in a separate directory?

转载 作者:行者123 更新时间:2023-12-02 10:44:19 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com