我正在尝试使用 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/