链接器无法找到标准库

时间:2017-01-15 11:10:46

标签: linker g++ kernel libraries osdev

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

目前我有一个kernel.cpp文件,只包含一个main()函数,当我只编译和链接这个文件时,一切正常。但是,当我在一个不同的文件中添加一个类时,链接器开始抱怨:

/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

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

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

任何人都可以帮助我找到这些库的位置,以及如果它们不可用我怎么能得到它们?他们应该使用交叉编译器还是已经可以在我的macOS上使用?

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

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

欢迎任何帮助,谢谢!

1 个答案:

答案 0 :(得分:1)

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

添加-ffreestanding标志以告诉编译器您没有标准库。

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