簡體   English   中英

裸機C ++中的std :: streambuf實例化

[英]std::streambuf instantiation in bare metal C++

我正在嘗試使用C ++為裸機平台開發軟件。 我不使用異常,RTTI和動態內存分配。 (在我的g ++標志中使用“ -fno-exceptions -fno-unwind-tables -fno-rtti -nostdlib”)。 我想重用std :: streambuf功能來讀取/寫入順序數據,因此我通過繼承std :: streambuf定義了自己的流緩沖區。 結果,我在編譯應用程序時收到未解決的引用:

undefined reference to `std::basic_streambuf<char, std::char_traits<char> >::basic_streambuf()'
undefined reference to `std::basic_streambuf<char, std::char_traits<char> >::~basic_streambuf()'
undefined reference to `std::basic_streambuf<char, std::char_traits<char> >::imbue(std::locale const&)'
undefined reference to `std::basic_streambuf<char, std::char_traits<char> >::setbuf(char*, int)'
undefined reference to `std::basic_streambuf<char, std::char_traits<char> >::seekoff(long long, std::_Ios_Seekdir, std::_Ios_Openmode)'
...

問題是:在編譯過程中是否可以像在其他普通模板中一樣實例化std :: streambuf函數,而無需嘗試在stdlib中使用它?

更新:我完全知道-nostdlib占用了整個運行時環境。 那是我的意圖 我只想僅使用new位置重用STL和BOOST中的模板化類。 即使編譯器試圖生成對某些函數的調用,例如“ void operator delete(void *)”,“ void __cxa_pure_virtual()”或“ __aeabi_atexit()”,我也可以創建空存根,知道這些函數將永遠不會被調用。 問題是,是否有辦法像其他模板化模板那樣強制系統隱式實例的常規隱式實例化(使用時)?

由於IO錯誤處理,我認為您無法有效使用帶有異常的流。 您可能需要一個malloc。 如果您編寫OS內核,則首先需要內存管理器,對於內核模式驅動程序-使用低級OS函數,例如SLAB分配器。

還有一件事-是C和C ++庫。 如果您想使用其中的一些功能,則需要一個。 有一些實現,例如newlib,libc的msullibc,您將需要提供C ++ ABI實現並與-lsupc ++鏈接

無論如何,如果您正在尋找一種實現,則可以進入https://github.com/incoder1/IO/blob/master/include/stream.hpp

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM