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

如果你編寫自己的內核,那麼你是獨立的,這就是關鍵。在寫入(或移植)標準庫之前,您需要編寫系統調用。

添加一個 - 標誌,告訴編譯器你沒有標準庫。

編輯:添加-nostdlib告訴你沒有一個標準庫和-lgcc因爲編譯器威力進行調用,爲libgcc鏈接(這個庫是你的交叉編譯器提供)。 -m32是不必要的,因爲你的交叉編譯器是用32位目標製作的

+0

謝謝Sjur,我知道我是獨立的。我已經把這個--freestanding標誌傳遞給了編譯器。我用我執行的命令更新了問題,以構建和鏈接代碼。 – 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