2

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

4

1 回答 1

0

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

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

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

于 2018-03-07T12:51:20.407 回答