std::裸机C++中的 streambuf 实例化

std::streambuf instantiation in bare metal C++

本文关键字:streambuf 实例化 中的 C++ 裸机 std      更新时间:2023-10-16

我正在尝试使用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 带走了整个运行时环境。这就是我的意图。我只想在 STL 和 BOOST 中重用模板化类,仅使用放置 new。即使编译器尝试生成对某些函数的调用,例如"void 运算符 delete(void*("、"void __cxa_pure_virtual(("或"__aeabi_atexit((",我也可以创建空存根,知道这些函数永远不会被调用。问题是是否有任何方法可以像任何其他模板化类一样强制系统标头类的常规隐式实例化(使用时(?

我认为您无法有效地使用异常流,因为 IO 错误处理。而且您可能需要一个malloc。如果您编写操作系统内核,则首先需要内存管理器,对于内核模式驱动程序 - 例如使用SLAB分配器等低级操作系统函数。

还有一件事 - 是 C 和C++库。如果您想使用它中的某些功能,则需要一个。有像newlib,msullibc这样的实现,你需要提供C++ABI实现并与-lsupc++链接

无论如何,如果您正在研究实现,则可以研究 https://github.com/incoder1/IO/blob/master/include/stream.hpp