几天来我一直在寻找解决方法。到目前为止还没有运气。
我用什么:
- STM32F103VET6
- J-Link
- RealView MDK-ARM v4.12
- 我的程序中的 C 和 C++ 代码
在我的代码中包含 STL 之前,一切正常。我可以毫无问题地重新定位到 USART printf()
。scanf()
这是通过包含Retarget.c
RV-MDK 附带的内容并编写我自己的sendchar()
和getkey()
. Retarget.c
有一行#pragma import(__use_no_semihosting_swi)
要求链接器使用 的重定向版本<cstdio>
,而不是调用半主机实现。
但是当我开始#include <deque>
and时deque<int> buffer;
,它不再起作用了。似乎链接器已经决定<deque>
取决于 semihosting <cstdio>
,这与我刚刚编写的重定向代码冲突。
我尝试过但失败了:
- 摆脱
__no_semihosting_swi
并尝试覆盖_sys_open()
. 它不起作用,因为半主机<cstdio>
依赖于已经导出此符号的目标文件。 - 此处建议的用法
$super$$
和$sub$$
语法(我想我已经尝试了他们提供的所有内容!) - 使用“MicroLIB”。这是史诗般的失败。
- 深入研究提供的 STL 标头。我发现没有引用任何
stdio
. 而且,由于我可以#include <cstdio>
并且仍然有重新定位,我认为即使是参考也不会产生任何影响。
我怀疑该解决方案与指导链接器有关,但到目前为止我还没有弄清楚......这太令人沮丧了!