找回密码
 注册
关于网站域名变更的通知
查看: 346|回复: 2
打印 上一主题 下一主题

built-in function 错误的解决

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-4-26 10:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
在编译《嵌入式Linux应用开发完全手册》的UART实验时候,出现一个以下警告:# c* @5 Z0 I1 Q. ^: E3 f
+ r! C6 L5 n. a3 J$ \( H/ o! `' a2 F+ z
serial.h:2: warning: conflicting types for built-in function 'putc'5 G! A) S3 v" ?( E* o7 x8 |8 w
, n/ D2 Q$ \0 c

0 G. C0 e5 z1 B/ y' ^7 p- w, u/ g
       什么意思呢?首先什么叫built-in function,查阅《C Primer Plus》发现这个叫做内建函数,printf,strchr,memset等等这些函数就是内建函数,这类函数不需要包含头文件中的声明,
+ s! `6 |2 X7 m1 N# T3 c( I/ k, u& i7 M8 \
就可以编译链接该函数,当你想自己实现一个函数叫printf函数的时候,就会出现冲突的警告。# J# D& D0 C: m: o; N$ N1 K

( l5 `# j+ [) G6 L9 \      在UART实验里,我们用到一个函数,叫putc的函数,如下:( m: u0 r- Z. L3 u3 m( r0 l
# h! I- P' d7 `' |* v! E- i
/** Z! u9 M' j+ D0 t
* 发送一个字符
# {) H  U: R# r+ ~& u) h0 B */
6 `" e3 ^& R$ f$ b& l' {; |, v0 x# {void putc(unsigned char c)
4 l: M4 G+ E7 t$ J{9 G6 G) t5 [% X! Z8 m
    /* 等待,直到发送缓冲区中的数据已经全部发送出去 */* d) |+ @. v3 |
    while (!(UTRSTAT0 & TXD0READY));& q0 q$ B4 |! M: k  }( Z

. a! v$ K' W9 b7 W! D4 g    /* 向UTXH0寄存器中写入数据,UART即自动将它发送出去 */
3 w0 e. k5 T# T" H) A4 s3 ~    UTXH0 = c;) Z9 H  R! V  i1 ]- Q$ g
}
! L5 w! }$ K3 N/ ^% ~
0 S2 L7 ]: l1 x/ [3 |' z# n& H6 W" |% b

+ X5 D/ y# J* ~  R6 O" A% Qputc其实也是属于built-in function,当我们自己想实现这个putc函数的时候就会发生冲突。
/ W6 n5 B" U/ M: F& y. v+ p1 V
* [2 j$ M9 {/ b+ J. H" S     该怎么解决呢?其实很简单,就是在你编译的时候加上 -fno-builtin  就可以正常编译了。
, x7 V7 t; \' r% i6 _$ Z1 O! c7 T9 f% L0 d6 q* K+ O
本UART实验的Makefile修改成如下,即可正常编译:
9 e0 u9 P1 q3 E2 E4 c$ `) b  Y8 a
- g3 c# _9 V% c* P1 _
9 k# f6 x5 }# Z0 j/ A) b1 _) J9 ]* K/ f( S
objs := head.o init.o serial.o main.o2 e  l$ v4 x, p2 c& z. E% E

' k2 G1 t5 I5 q6 `) cuart.bin: $(objs)
6 X: a; g& K- m9 m* x ARM-linux-ld -Tuart.lds -o uart_elf $^
& \; D6 J; q8 _, Q$ N arm-linux-objcopy -O binary -S uart_elf $@
. v2 C7 g+ c7 m2 Q* E$ c arm-linux-objdump -D -m arm uart_elf > uart.dis
  m$ W  S$ P6 T! t4 S1 j0 T1 O9 I6 G# }! u
%.o:%.c1 g# q* B! o  ?2 v: b
arm-linux-gcc -Wall -O2 -nostdlib -fno-builtin -c -o $@ $<                 //红色为另外添加的信息, \: N3 M8 `) `+ b2 j& `6 B
) Z9 A" a7 k0 P
%.o:%.S
% h' C7 G6 F* |% |/ ]! k arm-linux-gcc -Wall -O2 -nostdlib -fno-builtin -c -o $@ $<
/ G! Z* L4 ?( X+ h! D0 J9 w) O* }6 [+ v4 T
clean:4 K9 `3 T0 W7 S0 @' N4 V
rm -f uart.bin uart_elf uart.dis *.o
3 ], Q' W9 k. c6 ]2 b
6 z( H) T( u1 H
; `" ]/ n7 ]) u" G
* h) q4 E& s, b4 p) H0 }  F-nostdlib' ~8 Y5 v0 U7 {  p, i3 L, w3 K  p

( j5 Q7 O. ^5 @8 v( _# {        不连接系统标准启动文件和标准库文件,只把指定的文件传递给连接器。这个选项
; D( S3 Z0 f% \
- c2 x8 ?3 X4 N常用语编译内核、bootloader 等程序,它们不需要启动文件标准库文件。2 P" F9 j2 ]& w. J' K4 J
, `4 q9 }# q/ U7 Q5 g5 k
8 E. k! ?$ L$ q0 @% t
: ], t1 H1 Z5 f5 |, H4 e9 u2 F
  • TA的每日心情

    2019-11-29 15:37
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2020-4-26 14:12 | 只看该作者
    built-in function 错误的解决

    该用户从未签到

    3#
    发表于 2020-4-27 13:21 | 只看该作者
    built-in function 错误的解决
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-26 00:28 , Processed in 0.156250 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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