std::裸机C++中的 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 带走了整个运行时环境。这就是我的意图。我只想在 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
- 从C++实例化QML
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 约束和显式模板实例化
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 对象实例化调用构造函数的次数太多
- 如何使用非默认构造函数实例化模板化类
- 静态数据成员模板专用化的实例化点在哪里
- 错误的cv::face FacemarkLBF实例化
- C++的解析器在可以区分比较和模板实例化之前会做什么?
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 检查某些类型是否是模板类 std::optional 的实例化
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- 模板化类构造函数的模板实例化
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 受约束的成员函数和显式模板实例化
- 对显式实例化的模板函数的未定义引用
- std::裸机C++中的 streambuf 实例化