【问题标题】:Porting kernel project from DJGPP to MinGW将内核项目从 DJGPP 移植到 MinGW
【发布时间】:2011-10-18 14:54:50
【问题描述】:

尝试使用 MinGW 和 NASM(以前的 DJGPP 和 NASM)编译 C++ 内核项目。实际上也尝试过 Cygwin,结果完全相同:

  • 首先,将\DJGPP\bin 换成\MinGW\bin。得到以下链接错误:target coff-go32 not found.
  • 将目标交换为elf32-i386,得到cannot perform PE operations on non PE output file 'build/kernel.elf' 这是一个奇怪的错误,因为据我所知,我没有进行任何“PE 操作”。
  • 再次将目标更改为pe-i386,出现新错误build/Common.o:Common.cc:(.text+0x2a): undefined reference to 'atexit'

似乎 MinGW 正在为静态类生成 atexit 调用。 DJGPP 没有。内核在关机期间进行自己的 DTOR 处理。我知道定义atexit 会“解决”这个问题,但此时这更像是一种破解,而不是一个长期的解决方案。我宁愿让 MinGW 编译现有代码而无需任何(或最少)修改。

坦率地说,我对 Windows 构建环境不是很熟悉,并且可以使用任何提示来做什么。该项目(减去上面列出的更改)在 DJGPP 下可以正常编译和启动。区别似乎在于 DJGGP 和 MinGW 处理编译时类声明的方式?

编辑: 最终崩溃并在 Cygwin 上构建了一个交叉编译器。现在一切正常。

【问题讨论】:

  • OSDev wiki 可能有有用的信息(它是 x86 osdev imo 的宝贵资源)。对于更具体的建议,您应该包括您的确切构建步骤(命令行/ Makefile 和任何相关代码)。

标签: c++ operating-system mingw osdev djgpp


【解决方案1】:

您需要构建一个独立的交叉编译器。这个问题在OSDev Wiki 中被多次引用,以至于大多数人建议您首先创建一个交叉编译器来开始编写内核。

This article 将提供一步一步的参考来构建您自己的交叉编译器。请注意,在 Windows 中,您可能必须使用 MingW 或 Cygwin 构建交叉编译器

【讨论】:

  • Windows 构建环境太疯狂了! :) 这是我最终采用的解决方案。 +1 以获得良好的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
  • 2020-04-20
  • 2010-10-06
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多