Linker 链接器找不到标准库 我正在为我自己的爱好操作系统写一个C++内核。我在mac上工作,并编译了一个使用gcc版本4.8.2的交叉编译器

Linker 链接器找不到标准库 我正在为我自己的爱好操作系统写一个C++内核。我在mac上工作,并编译了一个使用gcc版本4.8.2的交叉编译器,linker,g++,kernel,libraries,osdev,Linker,G++,Kernel,Libraries,Osdev,目前我有一个kernel.cpp文件,只包含一个主函数,当我只编译和链接这个文件时,一切正常。但是,当我在另一个文件中添加一个类时,链接器开始抱怨: /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: ca

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

/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

欢迎任何帮助,谢谢

若您编写自己的内核,那个么您就要自己动手了,这就是重点所在。您需要先编写系统调用,然后才能编写或移植标准库

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


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

谢谢Sjur,我知道我是靠自己。我已经将-ffreestanding标志传递给编译器。我用我为构建和链接代码而执行的命令更新了这个问题。您还应该添加-nostlib和-lgcc。谢谢,-nostlib成功了!还感谢您指出OSDev的这一页。在寻找答案的过程中,我看到了他们的很多页面,但我没有找到这一页。