【发布时间】:2016-06-30 13:34:11
【问题描述】:
我正在尝试在 Linux 和 Mac 中使用 makefile 构建 Atmel BitCloud v3.2 示例应用程序 Blink。在 Windows 中一切正常。但在类似 Posix 的系统中,以下行不起作用:
all: directories images root_files size
$(OBJ_PATH)/%.o: $(SRCS)
$(CC) $(CFLAGS) $(filter %/$(subst .o,.c,$(notdir $@)), $(SRCS)) -o $@
因此,没有执行编译器,也没有创建目标文件。结果,链接器会显示错误消息,例如
avr-gcc:错误:All_MegaRf_Atmega256rfr2_8Mhz_Gcc/Obj/blink.o:没有这样的文件或目录
$(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,但是作者自己找到的解决方案在我看来没有很好的解释,所以我无法解决我的问题。
【问题讨论】:
-
@MichaëlAzevedo:您最近的编辑似乎删除了语义上重要的空白。请不要用您不熟悉的语言编辑代码。谢谢。
-
@tripleee 我的错,我试图用代码缩进替换背包逃逸。我应该恢复到以前的吗?
-
@MichaëlAzevedo 不需要;我已经恢复了丢失的标签。感谢您如此迅速地做出回应。
-
@tripleee 感谢您的编辑 :)
-
我不清楚为什么 Makefile 不工作,以及你所说的 POSIX 到底是什么意思。 Makefile 使用 GNU Make 语法扩展,因此显然不适用于 POSIX Make。
标签: linux makefile pattern-matching posix rules