Osdev 链接器在 docker 错误中的多个定义

Osdev linker multiple defintions inside docker error

提问人:amanuel2 提问时间:9/4/2023 更新时间:9/4/2023 访问量:40

问:

我打算在长时间休息后在我的操作系统上工作。当时我正在开发 amd64 系统,所以构建没有问题,但现在因为我在我的 m1 mac 上工作,我必须使用 docker。令人惊讶的是,我仍然保留着我的旧电脑,并检查了我的旧版本是否在那里工作并且它 100% 好。但是当我尝试使用 docker 构建它时,问题就出现了。

这是makefiles(old=no docker)的区别,(new = with docker)。差异更改

这是我的github项目

现在,我的错误出现在没有编译“子目录”,而是在这一行中:

#
# Link

$(BONEOS_BIN): $(libraries) $(LINKER_SCRIPT)
    $(LD) $(LDPARAMS) \
    -T $(LINKER_SCRIPT) \
    -o $@ \
    --start-group $(libraries) --end-group \
    -Map=BoneOS.map \
    -L$(LIBGCCDIR) -l$(LIBGCCNAME)

我收到以下错误:https://pastebin.com/t7JHw0DX

这是多个定义错误,但我不确定我在这里做错了什么。

如果您想知道,我的最终目标是在 docker 容器中构建 iso 映像,然后我可以将 ISO 映像从 docker 拉到我的笔记本电脑,然后可以在这里为自己运行 iso 映像。

c docker makefile 链接器错误 osdev

评论

1赞 Michael Petch 9/4/2023
从第一个重新定义错误开始。它是变量,它来自 gdt.h 并显示在目标文件 gdt.o 和 cpu.o 中。gdt.h 包含在 gdt.c 和 cpu.c 中。您已经定义了一个结构...并在标头中定义了该类型的全局变量。每个包含 gdt.h 的 .c 文件都将尝试创建自己的 .在 gdt.h 中声明,并在 gdt.c 中定义该类型的变量。因此,不应在头文件中定义全局变量。gpstruct gdt_ptrgpgpstruct gdt_ptr
1赞 Michael Petch 9/4/2023
当然,在 gdt.h 头文件中,您可以声明为 并将实际变量放在 gdt.c 中。您可能希望阅读此答案: stackoverflow.com/a/1433387/3857942gpextern
1赞 Michael Petch 9/4/2023
我刚刚在我的 x86-64 Ubuntu 22.04 系统上克隆了您的 Github 存储库并运行了 Makefile,但它以同样的方式失败了,并出现了重新定义错误。我怀疑你在它工作的系统上已经很旧了。ld
1赞 amanuel2 9/4/2023
Np,我以为你可能因为他叫迈克哈哈。我想知道您是否在 StackOverflow 聊天室、Gitter 或 Skype 上进行联系。在这件事上,我可能需要更多帮助。我明白,如果你很忙,不用担心!
1赞 Michael Petch 9/4/2023
您也可以在 OSdev 论坛或 Reddit r/osdev 上找到我。

答: 暂无答案