链接器无法找到标准库
Linker is unable to find standard libraries
我正在为我自己的爱好操作系统编写一个 C++ 内核。我在 mac 上工作,并从 gcc 版本 4.8.2 编译了一个工作(直到现在)的交叉编译器。
目前我有一个 kernel.cpp
文件,只包含一个 main()
函数,当我编译 link 只有这个文件时,一切正常。但是,当我在另一个文件中添加 class 时,link 用户开始抱怨:
/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
我发现这些都是缺少标准库,对吧?
一个有趣的细节是,当我将相同的 class 添加到 kernel.cpp
而不是新文件时,它就像一个魅力。
任何人都可以帮助我在哪里找到这些库,如果它们不可用,我该如何获取它们?它们应该随交叉编译器一起提供还是应该已经在我的 macOS?
上可用
这就是我构建代码的方式:
i686-elf-g++ -Wall -ffreestanding -m32 vga/vga.cpp kernel.cpp -o kernel.bin
欢迎任何帮助,谢谢!
如果您编写自己的内核,您就是一个人,这就是重点。在编写(或移植)标准库之前,您需要先编写系统调用。
添加一个 -ffreestanding 标志告诉编译器你没有标准库。
编辑:添加 -nostdlib 告诉链接器您没有标准库和 -lgcc 作为编译器 可能 调用 libgcc(此库由你的交叉编译器)。 -m32 是不必要的,因为你的交叉编译器是用 32 位目标制作的
我正在为我自己的爱好操作系统编写一个 C++ 内核。我在 mac 上工作,并从 gcc 版本 4.8.2 编译了一个工作(直到现在)的交叉编译器。
目前我有一个 kernel.cpp
文件,只包含一个 main()
函数,当我编译 link 只有这个文件时,一切正常。但是,当我在另一个文件中添加 class 时,link 用户开始抱怨:
/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
我发现这些都是缺少标准库,对吧?
一个有趣的细节是,当我将相同的 class 添加到 kernel.cpp
而不是新文件时,它就像一个魅力。
任何人都可以帮助我在哪里找到这些库,如果它们不可用,我该如何获取它们?它们应该随交叉编译器一起提供还是应该已经在我的 macOS?
上可用这就是我构建代码的方式:
i686-elf-g++ -Wall -ffreestanding -m32 vga/vga.cpp kernel.cpp -o kernel.bin
欢迎任何帮助,谢谢!
如果您编写自己的内核,您就是一个人,这就是重点。在编写(或移植)标准库之前,您需要先编写系统调用。
添加一个 -ffreestanding 标志告诉编译器你没有标准库。
编辑:添加 -nostdlib 告诉链接器您没有标准库和 -lgcc 作为编译器 可能 调用 libgcc(此库由你的交叉编译器)。 -m32 是不必要的,因为你的交叉编译器是用 32 位目标制作的