【问题标题】:Using assembly object files from a subdirectory使用子目录中的程序集对象文件
【发布时间】:2012-12-30 01:18:28
【问题描述】:

我有一个包含几个 .c 文件和一个 .s 程序集文件 (crt0.s) 的小项目。 .c 文件被编译成 .o 文件,并存储在 ./build 子目录中。这些文件可以正确编译和链接。

我希望 .s 文件也存储在 ./build 目录中。到目前为止,我的 makefile 编译了 .s 文件并将其存储在正确的位置,但是链接器找不到它。

我得到的错误是“ld.exe 找不到 crt0.o”。 crt0.o 肯定是在 ./build 目录中创建的。

这是生成文件:

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 目录中

【问题讨论】:

  • 运行 make -n 看看实际发生了什么。
  • 当你的 Makefile 正在执行时,它应该回显它正在运行的命令(默认情况下)。因此,您可以准确查看您请求的命令,并比较您手动调用的命令。

标签: c gcc makefile


【解决方案1】:

“手动”变体怎么会好? var 对象包含 ./build/crt0.o ,这是您的链接器需要的。你推入的 as 命令没有提供它,那么它有什么帮助呢?即使这样做了,也为时已晚,因为所有对象加在一起都是规则的依赖项。

make clean 并向我们展示输出,这可能有助于发现发生了什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    相关资源
    最近更新 更多