Makefile规则未在Linux中执行

时间:2016-03-15 08:15:16

标签: linux makefile pattern-matching posix rules

我正在尝试使用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这样的smth替换它,则表示正在成功创建相应的对象文件。

我甚至可以通过手动设置构建目标来构建整个应用程序,如下所示:

$(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,但我认为,作者自己找到的解决方案并没有得到很好的解释,所以我无法解决我的问题。

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

管理最终解决它。 为了在Windows和Linux中进行编译,应该更改makefile,如下所示:

objects := $(patsubst %.c,$(OBJ_PATH)/%.o,$(notdir $(SRCS)))
$(objects): $(SRCS)
#$(OBJ_PATH)/%.o: $(SRCS)
    $(CC) $(CFLAGS) $(filter %/$(subst .o,.c,$(notdir $@)), $(SRCS)) -o $@

其中$(OBJ_PATH)/%.o: $(SRCS)应被评论或删除。 完成这个方式后,项目可以在linux或Mac下构建,并在Atmel Studio 6.2和Atmel Studio 7的Windows下构建。后者无法构建,就像在linux或mac中无法构建一样。