我正在开发一个AVR项目,并且有多个文件夹包含我的代码。
我使用的makefile是Pat Deegan的“标准化AVR Makefile模板”。 它能够正确编译每个文件夹中的每个cpp文件,并生成正确的对象(.o)文件。
但是,链接器失败,因为它试图在子文件夹中找到.o文件(编译器将它们放在主文件夹中)。 这是我得到的错误的一个例子:
avr-gcc:subfolder / module.o:没有这样的文件或目录:***
[GrandCanyon.out]错误1
您可以帮我修改它,以便链接器和编译器放置并检查相同文件夹中的文件(.o)吗?
谢谢
你可以在这里获取makefile:http://electrons.psychogenic.com/articles/Makefile.tpl
答案 0 :(得分:2)
问题是filter命令,它删除目录并只保留文件名(link)。因此,不要在一行中定义所有文件并执行:
# C
CFILES=$(filter %.c, $(PRJSRC))
# Assembly
ASMFILES=$(filter %.S, $(PRJSRC))
您需要手动定义每种类型的文件列表:
CCFILES = sub1/file1.c sub2/file2.c
ASMFILES = sub1/file1.asm sub3/file2.asm
答案 1 :(得分:1)
嗨,我只用C ++编写C语言中的avr MCU。所以我在CFLAGS
部分扩展了关于一行的makefileCFLAGS=-I. $(INC) -g -mmcu=$(MCU) -O$(OPTLEVEL) \
-fpack-struct -fshort-enums \
-funsigned-bitfields -funsigned-char \
-Wall -Wstrict-prototypes \
-o $(firstword $(filter %.o, $(<:.c=.o))) \
-Wa,-ahlms=$(firstword $(filter %.lst, $(<:.c=.lst)))
当我在子目录中有源文件时,这对我有用。 我希望这会帮助你,而不是C ++