我正在为自己的业余爱好操作系统编写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
欢迎任何帮助,谢谢!
答案 0 :(得分:1)
如果你自己编写内核,那就是你自己的内容,这就是重点。在编写(或移植)标准库之前,您需要编写系统调用。
添加-ffreestanding标志以告诉编译器您没有标准库。
编辑:添加-nostdlib告诉链接器您没有标准库和-lgcc,因为编译器可能调用libgcc(此库由交叉编译器提供)。 -m32是不必要的,因为您的交叉编译器是使用32位目标