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

时间:2013-10-11 08:13:47

标签: c++ g++

我正在尝试使用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中重用仅使用placement new的模板化类。即使编译器试图生成对某些函数的调用,例如“void operator delete(void *)”,“void __cxa_pure_virtual()”或“__aeabi_atexit()”,我也可以创建空存根,因为知道永远不会调用这些函数。问题是,是否有任何方法可以强制系统头类的常规隐式实例化(使用时),就像任何其他模板化类一样?

1 个答案:

答案 0 :(得分:0)

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

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

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