linux - Makefile 规则未在 Linux 中执行

标签 linux makefile pattern-matching posix rules

我正在尝试使用 makefile 构建 Atmel BitCloud v3.2 示例应用程序 Blink在 Linux 和 Mac 中。在 Windows 中一切正常。但在类似 Posix 的系统中,以下行不起作用:

all: directories images root_files size
$(OBJ_PATH)/%.o: $(SRCS)
    $(CC) $(CFLAGS) $(filter %/$(subst .o,.c,$(notdir $@)), $(SRCS)) -o $@

因此,编译器没有被执行,目标文件也没有被创建。结果,链接器显示错误消息,例如

avr-gcc: error: All_MegaRf_Atmega256rfr2_8Mhz_Gcc/Obj/blink.o: No such file or directory

$(OBJ_PATH)/%.o: $(SRCS) 行是问题的根源。

如果我用 $(OBJ_PATH)/blink.o: ../../src/blink.c 之类的东西替换它,则相应的目标文件已成功创建。

我什至能够通过如下手动设置构建目标来构建整个应用程序:

$(OBJ_PATH)/blink.o: ../../src/blink.c
    $(CC) $(CFLAGS) $(filter %/$(subst .o,.c,$(notdir $@)), $(SRCS)) -o $@
$(OBJ_PATH)/stdPdsEvents.o: ../../../../BitCloud/Components/PersistDataServer/std/src/stdPdsEvents.c
    $(CC) $(CFLAGS) $(filter %/$(subst .o,.c,$(notdir $@)), $(SRCS)) -o $@

对于项目中的所有.c 文件。

另一方面,源列表定义如下:

SRCS = \
 ../../src/blink.c \
 ../../../../BitCloud/Components/PersistDataServer/std/src/stdPdsMemAccess.c \
 ../../../../BitCloud/Components/PersistDataServer/std/src/stdPdsTimer.c \

谁能帮我弄清楚为什么模式匹配不起作用以及如何恢复它。

注:类似话题已开放here ,但是作者自己找到的解决方案在我看来并没有很好地解释,所以我无法解决我的问题。

最佳答案

让每个目标文件都依赖于所有 源文件然后让编译步骤从源列表中找出实际上有用的文件的构造非常可疑。更好的方法是生成 Makefile 片段并包含它,如下所示:

makefile.d:
    echo "$(SRCS)" \
    | tr ' ' '\n' \
    | sed -n 's%\(.*\)/\([^/]*\)\.c$$%$(OBJ_PATH)/\2.o: \1/\2.c%p' >$@
include makefile.d

sed 的所有细节都没有正确标准化,因此您最好用 Perl 或其他语言重写替换。这里的重点是我们如何捕获路径和基本名称并为每个依赖项生成特定规则。

关于linux - Makefile 规则未在 Linux 中执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36005734/

相关文章:

linux - ping "-n"标志如何工作?并且它会影响响应时间吗? (Linux)

c - Linux内核编译报错elf_x86_64 missing

linux - 当 Dockerfile 存在于该文件夹中时,如何将任何文件夹复制到 Docker 容器?

Scala 鸭子打字模式匹配

linux - sed 帮助 : matching and replacing a literal "\n" (not the newline)

linux - 之间的差异 |和 ;和 &

c++ - 在 Makefile 中链接时定义变量的问题

c# - 有没有更好的方法从 c# 项目运行 c++ 生成文件?

c - Makefile 的正确标准是什么?

java - 生成在空格之间添加 + 号作为每一行的一个字符串的模式