2016-03-15 95 views
0

我正在尝试构建Atmel BitCloud v3.2示例应用程序在Linux和Mac中与makefile闪烁。在Windows中一切正常。但是在类似Posix的系统中,以下行不起作用:Makefile规则未在Linux中执行

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

因此,编译器未被执行且目标文件未被创建。其结果是接头显示错误消息,例如

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 [email protected])), $(SRCS)) -o [email protected] 
$(OBJ_PATH)/stdPdsEvents.o: ../../../../BitCloud/Components/PersistDataServer/std/src/stdPdsEvents.c 
    $(CC) $(CFLAGS) $(filter %/$(subst .o,.c,$(notdir [email protected])), $(SRCS)) -o [email protected] 

在项目的所有.c文件。

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

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

谁能帮我弄清楚为什么是模式匹配不工作,如何恢复它。

注:类似的话题已经被打开here,但笔者次找到了自己的解决方案并没有在我看来很好地解释,所以我没能解决我的问题。

+0

@MichaëlAzevedo:你最近的编辑似乎已经删除了语义上重要的空白。请不要使用您不熟悉的语言编辑代码。谢谢。 – tripleee

+0

@tripleee我的坏,我试图通过代码缩进来替换背包逃脱。我应该回到前一个吗? –

+0

@MichaëlAzevedo不需要;我已经恢复了丢失的标签。感谢您做出如此快速的回应。 – tripleee

回答

0

让每个目标文件的结构取决于所有源文件,然后让编译步骤鱼实际上有用的文件出源列表是相当可疑的。更好的办法是生成一个Makefile片段,包括它,像这样:

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

sed所有的细节都没有正确规范,所以你可能会更好重写Perl或东西替代。这里的牛肉是我们如何捕获路径和基本名称,并为每个依赖项生成特定规则。

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 [email protected])), $(SRCS)) -o [email protected] 

其中$(OBJ_PATH)/%.o: $(SRCS)应注释或删除。 完成这种方式后,可以在Atmel Studio 6.2和Atmel Studio 7下的linux或mac下和windows下构建项目。后者无法像Linux或Mac中无法构建。