gpt4 book ai didi

c - 如何正确使用 % 或 *(星号)符号作为 makefile 中的占位符?

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

我在创建“上下文无关/文件名不可知”makefile 来构建 C 项目时遇到问题,而每次添加新文件时都没有指定明确的文件名。我有以下项目结构:

include/ #dir to store all header files
lib1.h
lib2.h
...
src/ # dir of source code
obj/ #temporary dir for storing all .o files
lib1.o
lib2.o
...
lib1.c # start with #include "lib1.h"
lib2.c # the same
...
main.c

以及以下生成文件:

# dirs
IDIR=include
SDIR=src
ODIR=src/obj

_HEADS=*.h #or maybe % percentage instead?
HEADS=$(patsubst %, $(IDIR)/%, $(_HEADS))
_OBJS=*.o
OBJS=$(patsubst %, $(ODIR)/%, $(_OBJS))
_CFILES=*.c
CFILES=$(patsubst %, $(SDIR)/%, $(_CFILES))

# compiler
GCC=gcc
CFLAGS=-I$(IDIR)

$(OBJS): $(CFILES) $(HEADS)
$(GCC) -c -o $@ $< $(CFLAGS)

main: $(OBJS)
$(GCC) -o $@ $^ $(CFLAGS)

如果 src/include/ 文件夹下的 *.c 或 *.h 文件发生任何更改,我想要实现的是构建可执行文件 (不确定更改是否在 src/obj 下)。所以现在 make 不编译,因为它认为目标文件是“最新的”。所以我可能做错了什么,因为我需要先检查 .c 和 .h 文件。

我也不确定(即使在阅读了几个教程之后)如何正确使用 % 以及使用 % 和 * 星号之间的区别。例如,我看到了这样的东西:

%.o: %.c %.h
gcc -o foo %@ ...

规则%.o 到底是怎么写成规则名称的(我想如果它们都是普通名称而不是一些合乎逻辑的东西会更好)?或者,如果您在实际规则中使用像 %@ 这样的占位符以避免额外的命名“开销”,那么这样做是有意义的。拜托,任何人都可以解释并帮助我修复我的 makefile - 我真的搞砸了这些微妙的事情......

最佳答案

*是一个通配符,它​​为您提供一个列表并且与“shell”相关。

%是一个 makefile 内部通配符,它​​将以 for-each 的方式充当占位符(我将在下面解释)。

同时 *.c为您提供一个变量中所有 c 文件的列表,您可以使用 % 做更多事情

%.o: %.c %.h
gcc -o foo %@

例如,这称为 pattern-rule和每个 <placeholder>.c 的平均值和 <placeholder>.h生成目标 <placeholder>.o下面是相应的食谱。

使用模式规则 make 会生成这样的东西

a.o : a.c a.h
...
b.o : b.c b.h
...
c.o : c.c c.h
...

你目前正在尝试做的事情会导致

a.o b.o c.o : a.c b.c c.c a.h b.h c.h 
gcc ....

虽然这可能是有效的,但您有不必要的依赖项。 a.o不需要依赖 b.c例如

还有 _CFILES = *.c将导致“*.c”成为变量中的字符串而不是实际文件。如果你想扩展实际的文件名,你应该使用 wildcard功能

_CFILES  := $(wildcard *.c)

现在

CFILES=$(patsubst %, $(SDIR)/%, $(_CFILES))

也有类似占位符的“for-each” %

这意味着每次都有 %它将被替换为 $(SDIR)/% .因为您没有 % 的模式虽然在 patsubst 中匹配这会变得很奇怪。你想在这里实现什么?如果你想“剪掉”src从路径上看是相反的

CFILES=$(patsubst $(SRC)%, % , $(_CFILES))

但我怀疑你想这样做。您应该阅读此处多次链接的 makefile 文档。我解释了很多。

关于c - 如何正确使用 % 或 *(星号)符号作为 makefile 中的占位符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40155241/

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