Я искал обходной путь в течение нескольких дней.Пока что не повезло.
Что я использую:
- STM32F103VET6
- J-Link
- RealView MDK-ARM v4.12
- Код на C и C ++ в моей программе
До того, как я включил в свой код STL, все работает нормально.Я могу переназначить printf()
и scanf()
на USART без проблем.Это делается путем включения Retarget.c
, поставляемого с RV-MDK, и написания моих собственных sendchar()
и getkey()
.У Retarget.c
есть строка с надписью #pragma import(__use_no_semihosting_swi)
, которая требует, чтобы компоновщик использовал версию ретаргетинга <cstdio>
, вместо этого вызывая реализацию полухостинга.
Но когда я начал #include <deque>
и deque<int> buffer;
,это больше не работает.Кажется, что компоновщик решил, что <deque>
зависит от полухостинга <cstdio>
, который конфликтует с кодом ретаргетинга, который я только что написал.
То, что я попробовал и потерпело неудачу:
- Избавьтесь от
__no_semihosting_swi
и вместо этого попытайтесь переопределить _sys_open()
.Это не работает, потому что полухостинг <cstdio>
зависит от объектного файла, который уже экспортирует этот символ. - Используйте синтаксис
$super$$
и $sub$$
, предлагаемый здесь (я думаю, что 'мы перепробовали все, что они предоставили!) - Используйте «MicroLIB».Это EPIC FAIL.
- Копание в поставляемых заголовках STL.Я не нашел ссылки на какие-либо
stdio
.И, поскольку я могу #include <cstdio>
и все еще иметь ретаргетинг, я не думаю, что даже ссылка будет иметь какое-то значение.
Я подозреваю, что решение как-то связано с направлением компоновщика, но пока я не понял ... Это так расстраивает!