2017-01-15 18 views
0

Я пишу ядро ​​C++ для своей собственной операционной системы хобби. Я работаю над mac и компилировал рабочий (до сих пор) кросс-компилятор из gcc версии 4.8.2.Linker не может найти стандартные библиотеки

В настоящее время у меня есть файл 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

Если вы пишете свое собственное ядро, вы сами по себе, это своего рода точка. Вам нужно будет написать системные вызовы, прежде чем вы сможете написать (или порт) стандартную библиотеку.

Добавить флагов -ffreestanding, чтобы сообщить компилятору, что у вас нет стандартной библиотеки.

Edit: добавить -nostdlib сказать компоновщик, что вы не имеете стандартную библиотеку и -lgcc как компилятор могуществе делать звонки libgcc (эта библиотека предоставляется вашим кросс-компилятор). -m32 не требуется, так как ваш кросс-компилятор сделан с 32-разрядной целью

+0

Спасибо Sjur, я знал, что я был один. Я уже передаю компилятор флаг --ffreestanding. Я обновил вопрос с помощью команд, которые я выполнил, для создания и связывания кода. – 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