gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:55:51 29 4
gpt4 key购买 nike

我正在尝试使用 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()”,我也可以创建空 stub ,因为我知道这些函数永远不会被调用。问题是是否有任何方法可以像任何其他模板化类一样强制系统头类的常规隐式实例化(在使用时)?

最佳答案

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

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

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

关于c++ - 裸机 C++ 中的 std::streambuf 实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19313377/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com