OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10268|回复: 17

编译时 _stdout 在stdio_streams.o and usart.o中重复定义

[复制链接]

3

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2016-7-16
在线时间
30 小时
发表于 2016-8-6 15:20:26 | 显示全部楼层 |阅读模式
5金钱
请教高手:
      我用的MDK5.14,库函数版本3.5,探索者STM32F4开发板
      自己新建的工程,用原子哥的参考代码 SYSTEM 里面的usart.c,
//加入以下代码,支持printf函数,而不需要选择use MicroLIB         
#if 1
#pragma import(__use_no_semihosting)            
//标准库需要的支持函数                 
struct __FILE
{
        int handle;


};


FILE __stdout;      
//定义_sys_exit()以避免使用半主机模式   
_sys_exit(int x)
{
        x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{      
        while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
    USART1->DR = (u8) ch;      
        return ch;
}
在不勾选 use microlib后,进行编译,会弹出如下错误:
..\OBJ\PICTURE.axf: Error: L6200E: Symbol __stdout multiply defined (by stdio_streams.o and usart.o).
Not enough information to list image symbols.
Not enough information to list the image map.
Finished: 2 information, 0 warning and 1 error messages.
"..\OBJ\PICTURE.axf" - 1 Error(s), 0 Warning(s).

如果我注释掉 FILE __stdout 这一行则会报出其他的错误:
linking...
..\OBJ\PICTURE.axf: Error: L6915E: Library reports error: __use_no_semihosting was requested, but _sys_open was referenced
..\OBJ\PICTURE.axf: Error: L6915E: Library reports error: __use_no_semihosting was requested, but _ttywrch was referenced
Finished: 0 information, 0 warning and 2 error messages.
"..\OBJ\PICTURE.axf" - 2 Error(s), 0 Warning(s).


奇怪的是,如果直接用原子哥的模板工程则不会报错。
刚才我又试过直接用原子哥的模板,不会报错,添加自己的car车牌识别程序上去就会报这样的错误  把car移除就不会报错!

是不是我的car程序有地方出错了?可是又没检查出来!
希望有解决的大神指教下小弟

最佳答案

查看完整内容[请看2#楼]

我看过你的代码,因为你用了fopen这样的C库函数,但是你没有加入KEIL提供的文件系统,那么fopen的就会引用默认的__stdin流,所以会出现重复定义.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

277

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1522
金钱
1522
注册时间
2014-5-16
在线时间
217 小时
发表于 2016-8-6 15:20:27 | 显示全部楼层
我看过你的代码,因为你用了fopen这样的C库函数,但是你没有加入KEIL提供的文件系统,那么fopen的就会引用默认的__stdin流,所以会出现重复定义.
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-8-6 19:12:21 | 显示全部楼层
应该是用到的库相冲突了。勾选usemicrolib以后,你直接去掉半主机的所有代码吧。
回复

使用道具 举报

3

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2016-7-16
在线时间
30 小时
 楼主| 发表于 2016-8-7 13:57:32 | 显示全部楼层
正点原子 发表于 2016-8-6 19:12
应该是用到的库相冲突了。勾选usemicrolib以后,你直接去掉半主机的所有代码吧。

//¼óèëòÔÏÂ′úÂë,Ö§3Öprintfoˉêy,¶ø2»DèòaÑ¡Ôñuse MicroLIB          
/*#if 1
#pragma import(__use_no_semihosting)            
//±ê×¼¿aDèòaμÄÖ§3Öoˉêy                 
struct __FILE
{
        int handle;

};

FILE __stdout;      
//¶¨òå_sys_exit()òÔ±üÃaê1óðëÖ÷»úģ꽠  
_sys_exit(int x)
{
        x = x;
}
//ÖØ¶¨òåfputcoˉêy
int fputc(int ch, FILE *f)
{      
        while((USART1->SR&0X40)==0);//Ñ-»··¢Ëí,Ö±μ½·¢Ëííê±Ï   
    USART1->DR = (u8) ch;      
        return ch;
}
#endif */

/*ê1óÃmicroLibμÄ·½·¨*/

int fputc(int ch, FILE *f)
{
        USART_SendData(USART1, (uint8_t) ch);

        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}       
   
    return ch;
}
int GetKey (void)  {

    while (!(USART1->SR & USART_FLAG_RXNE));

    return ((int)(USART1->DR & 0x1FF));
}
去掉之后出现
..\OBJ\PICTURE.axf: Error: L6218E: Undefined symbol exit (referred from car.o).
Not enough information to list image symbols.
Finished: 1 information, 0 warning and 1 error messages.
"..\OBJ\PICTURE.axf" - 1 Error(s), 0 Warning(s).
百度上说 use MicroLib 不支持exit()函数   我的程序中是使用了exit()函数的。
if(img->bmp_type==1){bitcolor=2;printf("2»Äü¶áè¡íË3ö");exit(-1);}
         if(img->bmp_type==4){bitcolor=16;printf("2»Äü¶áè¡íË3ö");exit(-1);}

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-8-12 22:23:20 | 显示全部楼层
流尘学 发表于 2016-8-7 13:57
//¼óèëòÔÏÂ′úÂë,Ö§3Öprintfoˉêy,¶ø2&# ...

没用过exit这个函数。。。
你得慢慢摸索下了
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2016-7-16
在线时间
30 小时
 楼主| 发表于 2016-8-13 16:06:40 | 显示全部楼层
正点原子 发表于 2016-8-12 22:23
没用过exit这个函数。。。
你得慢慢摸索下了

好吧    摸索一个礼拜了  要不我上传我的程序上来给原子哥你看看吧
回复

使用道具 举报

3

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2016-7-16
在线时间
30 小时
 楼主| 发表于 2016-8-13 16:25:31 | 显示全部楼层
正点原子 发表于 2016-8-12 22:23
没用过exit这个函数。。。
你得慢慢摸索下了

原子哥 这是源程序
回复

使用道具 举报

3

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2016-7-16
在线时间
30 小时
 楼主| 发表于 2016-8-13 16:29:23 | 显示全部楼层
源程序

源程序.rar

4.88 MB, 下载次数: 99

源程序

回复

使用道具 举报

3

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2016-7-16
在线时间
30 小时
 楼主| 发表于 2016-8-30 11:06:19 | 显示全部楼层
怎么又沉了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-8-31 22:00:01 | 显示全部楼层
你的car.c里面,用了什么lib导致和printf冲突了。

屏蔽掉usart.c里面的半主机相关代码,然后勾选use microlib的方式做串口输出吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2016-7-16
在线时间
30 小时
 楼主| 发表于 2016-8-31 22:13:28 | 显示全部楼层
正点原子 发表于 2016-8-31 22:00
你的car.c里面,用了什么lib导致和printf冲突了。

屏蔽掉usart.c里面的半主机相关代码,然后勾选use mic ...

试过了,编译还是没通过!
..\OBJ\PICTURE.axf: Error: L6218E: Undefined symbol exit (referred from car.o).
Not enough information to list image symbols.
Finished: 1 information, 0 warning and 1 error messages.
"..\OBJ\PICTURE.axf" - 1 Error(s), 0 Warning(s).
微库不支持exit()函数。
回复

使用道具 举报

5

主题

277

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1522
金钱
1522
注册时间
2014-5-16
在线时间
217 小时
发表于 2016-8-31 23:09:51 | 显示全部楼层
你这个代码明显是从控制台程序直接搬过来的,显然你并不知道PC程序和单片机程序在开发上的区别.
不过没关系,我给你说怎么改,很简单.
首先,为了你的scanf,去定义FILE __stdin;在你的usart.c中
然后自己实现C库的文件系统函数,有以下几个:fopen,fclose,exit,fread,fwrite,fseek,fprintf,你自己的函数不能和C库函数重名.
我给你定义了宏,带替对应的C库函数,就可以编译通过了
#define my_fopen(a,b)                 0
#define my_fclose(a)                0
#define my_exit(a)                        while(1)
#define my_fprintf(a,b,...)        0
#define my_fread(a,b,c,d)        0
#define my_fwrite(a,b,c,d)        0
#define my_fseek(a,b,c)                0
回复

使用道具 举报

5

主题

277

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1522
金钱
1522
注册时间
2014-5-16
在线时间
217 小时
发表于 2016-8-31 23:12:41 | 显示全部楼层
另外,我把你一个礼拜的问题给你解决了,是不是要加点分
回复

使用道具 举报

3

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2016-7-16
在线时间
30 小时
 楼主| 发表于 2016-9-1 20:41:53 | 显示全部楼层
可以可以 ,能加下好友嘛 我的QQ 1278219774  想仔细了解下
回复

使用道具 举报

3

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2016-7-16
在线时间
30 小时
 楼主| 发表于 2016-9-4 11:50:14 | 显示全部楼层
zmingwang 发表于 2016-8-31 23:09
你这个代码明显是从控制台程序直接搬过来的,显然你并不知道PC程序和单片机程序在开发上的区别.
不过没关系 ...

这需要勾选微库  微库不支持exit()返回函数  所以需要重写my_exit函数 就能编译成功。开发板不在身边不知道程序行不行
回复

使用道具 举报

41

主题

113

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2016-6-12
在线时间
61 小时
发表于 2016-10-15 19:23:00 | 显示全部楼层
正点原子 发表于 2016-8-31 22:00
你的car.c里面,用了什么lib导致和printf冲突了。

屏蔽掉usart.c里面的半主机相关代码,然后勾选use mic ...

原子哥,我也是遇到这个问题,请问您知道怎么解决么
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2016-8-13
在线时间
3 小时
发表于 2018-4-7 10:26:30 | 显示全部楼层
也遇到这个问题,贼心痛
回复

使用道具 举报

3

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2016-7-16
在线时间
30 小时
 楼主| 发表于 2018-4-24 18:06:40 | 显示全部楼层
科科1996 发表于 2018-4-7 10:26
也遇到这个问题,贼心痛

不懂问题出在哪里
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 15:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表