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