【问题标题】:Linker is unable to find standard libraries链接器找不到标准库
【发布时间】:2017-05-30 08:24:32
【问题描述】:

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

欢迎任何帮助,谢谢!

【问题讨论】:

    标签: linker g++ kernel libraries osdev


    【解决方案1】:

    如果您编写自己的内核,您就只能靠自己了,这就是重点。您需要先编写系统调用,然后才能编写(或移植)标准库。

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

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

    【讨论】:

    • 谢谢 Sjur,我知道我只能靠自己了。我已经将 --ffreestanding 标志传递给编译器。我用我执行的命令来构建和链接代码更新了问题。
    • Found this as osdev wiki. 您还应该添加 -nostdlib 和 -lgcc。
    • 谢谢,-nostdlib 成功了!还要感谢您在 OSDev 上指出此页面。我在寻找答案的过程中看到了很多他们的页面,但我没有找到这个。
    猜你喜欢
    • 2012-02-12
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多