2017-01-15 16 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

独自のカーネルを作成する場合は、自分で作成してください。これがポイントです。標準ライブラリを作成(または移植)する前に、システムコールを記述する必要があります。

-ffreestandingフラグを追加して、標準ライブラリがないことをコンパイラに通知します。

編集:あなたは makeがlibgccの呼び出しコンパイラかもしれませんが、標準ライブラリと-lgccを持っていないリンカを伝えるために-nostdlibを追加します(このライブラリはあなたのクロスコンパイラによって提供されます)。クロスコンパイラが32ビットのターゲットで作成されているため、-m32は不要です。

+0

ありがとうございました。私は自分自身を知っていました。私は既に--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

関連する問題