我有同樣的問題。我知道它與所謂的'semihosting'有關,我應該使用我的項目文件'retarget.c'來構建它,該項目文件包含作爲目標特定驅動程序級函數 (「_sys_xxxx()」)的 函數的定義許多版本的'retarget.c'都是Keil-MDK的一部分,也可以在網上找到)。 所以,我沒有,但然後鏈接器與此類似引發的錯誤:
Error: L6200E: Symbol _sys_open multiply defined (by arm_xxx_lib.o and retarget.o)
Error: L6200E: Symbol _sys_close multiply defined (by arm_xxx_lib.o and retarget.o)
...
我解決了這個編輯原始「的retarget.c」所以,在它定義的函數將 覆蓋的Keil-MDK庫的人。新的「retarged.c」是在這裏:
#include <stdio.h>
#include <rt_misc.h>
#pragma import(__use_no_semihosting_swi)
#include <rt_sys.h>
extern void $Super$$_sys_open(void);
FILEHANDLE $Sub$$_sys_open(const char *name, int openmode)
{
return 1; /* everything goes to the same output */
}
extern void $Super$$_sys_close(void);
int $Sub$$_sys_close(FILEHANDLE fh)
{
return 0;
}
extern void $Super$$_sys_write(void);
int $Sub$$_sys_write(FILEHANDLE fh, const unsigned char *buf,
unsigned len, int mode)
{
//your_device_write(buf, len);
return 0;
}
extern void $Super$$_sys_read(void);
int $Sub$$_sys_read(FILEHANDLE fh, unsigned char *buf,
unsigned len, int mode)
{
return -1; /* not supported */
}
extern void $Super$$_ttywrch(void);
void $Sub$$_ttywrch(int ch)
{
char c = ch;
//your_device_write(&c, 1);
}
extern void $Super$$_sys_istty(void);
int $Sub$$_sys_istty(FILEHANDLE fh)
{
return 0; /* buffered output */
}
extern void $Super$$_sys_seek(void);
int $Sub$$_sys_seek(FILEHANDLE fh, long pos)
{
return -1; /* not supported */
}
extern void $Super$$_sys_flen(void);
long $Sub$$_sys_flen(FILEHANDLE fh)
{
return -1; /* not supported */
}
extern void $Super$$_sys_exit(void);
long $Sub$$_sys_exit(FILEHANDLE fh)
{
return -1; /* not supported */
}
在這個版本中「的retarget.c」連接器的滿意,我的程序運行W/O問題。 也許這也會對你有所幫助。
你能展示一些實際的C++代碼嗎?刪除一行防止出現故障並不一定意味着該錯誤在該行中。 – Antonio
@Antonio當然,看看:https://gist.github.com/BetaRavener/5957167。 取消註釋任何push_back行都會導致此問題。 – Raven
scale_buffer的聲明怎麼樣? – Antonio