链接器无法找到标准库

Linker is unable to find standard libraries

我正在为我自己的爱好操作系统编写一个 C++ 内核。我在 mac 上工作,并从 gcc 版本 4.8.2 编译了一个工作(直到现在)的交叉编译器。

目前我有一个 kernel.cpp 文件,只包含一个 main() 函数,当我编译 link 只有这个文件时,一切正常。但是,当我在另一个文件中添加 class 时,link 用户开始抱怨:

/opt/cross/gcc-i686-elf/lib/gcc/i686-elf/4.8.2/../../../../i686-elf/bin/ld: cannot find -lstdc++
/opt/cross/gcc-i686-elf/lib/gcc/i686-elf/4.8.2/../../../../i686-elf/bin/ld: cannot find -lm
/opt/cross/gcc-i686-elf/lib/gcc/i686-elf/4.8.2/../../../../i686-elf/bin/ld: cannot find -lc
/opt/cross/gcc-i686-elf/lib/gcc/i686-elf/4.8.2/../../../../i686-elf/bin/ld: cannot find -lc

我发现这些都是缺少标准库,对吧?

一个有趣的细节是,当我将相同的 class 添加到 kernel.cpp 而不是新文件时,它就像一个魅力。

任何人都可以帮助我在哪里找到这些库,如果它们不可用,我该如何获取它们?它们应该随交叉编译器一起提供还是应该已经在我的 macOS?

上可用

这就是我构建代码的方式:

i686-elf-g++ -Wall -ffreestanding -m32 vga/vga.cpp kernel.cpp -o kernel.bin

欢迎任何帮助,谢谢!

如果您编写自己的内核,您就是一个人,这就是重点。在编写(或移植)标准库之前,您需要先编写系统调用。

添加一个 -ffreestanding 标志告诉编译器你没有标准库。

编辑:添加 -nostdlib 告诉链接器您没有标准库和 -lgcc 作为编译器 可能 调用 libgcc(此库由你的交叉编译器)。 -m32 是不必要的,因为你的交叉编译器是用 32 位目标制作的