我正在尝试使用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,但我认为,作者自己找到的解决方案并没有得到很好的解释,所以我无法解决我的问题。
答案 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中无法构建一样。