gpt4 book ai didi

c - 包含一个 Makefile,就好像我在另一个目录中一样?

转载 作者:太空宇宙 更新时间:2023-11-04 03:33:29 26 4
gpt4 key购买 nike

我正在做一个看起来像这样的项目:

rootdir/
Makefile
component1/
Makefile
component2/
Makefile
component3/
Makefile
lib1/
Makefile
lib2/
Makefile
lib3/
Makefile
Makefile.include

rootdir/component3/lib3/Makefile第一行是include Makefile.include

现在我想在名为 test 的新目录中为 lib3 中的代码编写一些单元测试。所以我们有这个结构:

rootdir/
Makefile
component1/
Makefile
component2/
Makefile
component3/
Makefile
lib1/
Makefile
lib2/
Makefile
lib3/
Makefile
Makefile.include
test/
Makefile
test1.c
test2.c

rootdir/component3/lib3/Makefile 中有一条规则如下:

$(LIB3_LIB): $(LIB3_OBJ) 
$(CC) $(LIB3_OBJ) -o $@

所以我认为编写测试的最自然方式是在 rootdir/component3/lib3/test/Makefile 中有一个规则,如下所示:

%.o : %.c $(LIB3_LIB)
$(CC) $(CFLAGS) -c $<

然后通过更多的步法,我将能够编写一个规则来捕获我的所有测试。

为了实现这一点,我想我可以像这样在 lib3/test/Makefileinclude lib3/Makefile:

include ../Makefile

但是这个错误:

test$ make 
../Makefile:1: Makefile.include: No such file or directory
make: *** No rule to make target `Makefile.include'. Stop.

这让我觉得它正在 lib3/test 中寻找 Makefile.include,这不是正确的做法。

我在 make docsinclude 部分没有看到任何内容。解决了这个问题,我怀疑我正在以错误的方式接近它。我错过了什么?

最佳答案

您的观察是正确的。它尝试包含 rootdir/component3/lib3/test 子目录中的 Makefile.inc。

如果您只是想确保库 LIB3_LIB 得到重新编译,您可以使用由 Makefile 中的 make -C .. 调用的子 make在 rootdir/component3/lib3/test 中。这将调用将父目录作为当前工作目录的 make,以便可以找到 Makefile.inc

rootdir/component3/lib3/test/Makefile 看起来像:

LIB3_LIB=../lib3.lib
%.o : %.c $(LIB3_LIB)
$(CC) $(CFLAGS) -c $<

# call sub-make
$(LIB3_LIB): FORCE
$(MAKE) -C ..

# force sub-make
.PHONY: FORCE
FORCE:

必须使用一个假目标(此处命名为 FORCE),以便始终调用 sub-make。编译规则仍然取决于库名。因此,仅当库已被子 make 更改时,单元测试才会重新编译。

每个子 make 打印一条关于更改目录的消息。如果您想摆脱它,请将此行添加到 Makefile 中:

MAKEFLAGS += --silent #--no-print-directory

关于c - 包含一个 Makefile,就好像我在另一个目录中一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34298423/

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