2017-01-15 99 views
0

我正在为自己的业余爱好操作系统编写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

如果你编写自己的内核,那么你是独立的,这就是关键。在写入(或移植)标准库之前,您需要编写系统调用。

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

编辑:添加-nostdlib告诉你没有一个标准库和-lgcc因为编译器威力进行调用,为libgcc链接(这个库是你的交叉编译器提供)。 -m32是不必要的,因为你的交叉编译器是用32位目标制作的

+0

谢谢Sjur,我知道我是独立的。我已经把这个--freestanding标志传递给了编译器。我用我执行的命令更新了问题,以构建和链接代码。 – Pieter

+0

[发现这是osdev wiki。](http://wiki.osdev.org/Why_do_I_need_a_Cross_Compiler%3F#Options_that_you_should_pass_to_your_Compiler)您还应该添加-nostdlib和-lgcc。 –

+0

谢谢,-nostdlib做到了!也感谢您在OSDev上指出这个页面。我在寻找答案时看到了很多他们的网页,但我没有找到这个答案。 – Pieter