我有一个包含几个.c文件和一个.s程序集文件(crt0.s)的小项目。 .c文件被编译为.o文件,并存储在./build子目录中。这些文件正确编译和链接。
我希望.s文件也存储在./build目录中。到目前为止,我的makefile编译.s文件并将其存储在正确的位置,但是链接器找不到它。
我得到的错误是“ld.exe无法找到crt0.o”。肯定是在./build目录中创建了crt0.o。
这是makefile:
CC=arm-none-eabi-gcc
AS=arm-none-eabi-as
CFLAGS=-nostartfiles -nodefaultlibs -fno-builtin -Wall -T linker.ld -I./Include
objects=$(addprefix $(OBJDIR)/,crt0.o main.o gpiopins.o framebuffer.o drawchar.o putchar.o intconv.o strlen.o kprintf.o kputchar.o)
OBJDIR=./build
$(OBJDIR)/%.o: %.s
$(AS) -o $@ $<
$(OBJDIR)/%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
kernel.img: $(objects)
$(CC) -o kernel.img $(objects) $(CFLAGS)
.PHONY : clean
clean:
rm -f kernel.img
rm -f *.o
rm -f $(OBJDIR)/*.o
我可能出错的任何想法?
谢谢
编辑: 如果我手动完成,那很好。例如:
kernel.img: $(objects)
arm-none-eabi-as -o crt0.o crt0.s
$(CC) -o kernel.img $(objects) $(CFLAGS)
但是,这意味着crt0.o不在./build目录
中答案 0 :(得分:0)
“手动”变体如何才行? var对象包含./build/crt0.o,这是您的链接器所需要的。你推入的as命令没有提供它,所以它有什么帮助?即使它确实如此,也会来得太晚,因为所有对象都是规则的依赖关系。
请清理并向我们显示输出,这可能有助于发现正在发生的事情。