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

built-in function 错误的解决

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
在编译《嵌入式Linux应用开发完全手册》的UART实验时候,出现一个以下警告:
3 d, R3 S9 m1 O# S
6 n2 `8 w3 g/ v( l) T( dserial.h:2: warning: conflicting types for built-in function 'putc'
3 n# \) ~9 p. T# Q& v& Q
8 X- S0 L* X& p: e8 w' p$ A3 [0 M7 Z6 s4 c* O9 ^$ B3 j

- {4 E" c: a# ~       什么意思呢?首先什么叫built-in function,查阅《C Primer Plus》发现这个叫做内建函数,printf,strchr,memset等等这些函数就是内建函数,这类函数不需要包含头文件中的声明,
; j* g5 y( g, P5 W: [1 `5 i
& W+ e0 w5 h$ p  x3 Y! u0 s就可以编译链接该函数,当你想自己实现一个函数叫printf函数的时候,就会出现冲突的警告。" x5 U+ F: z& S2 p; U: }

$ u* u  N9 U  l, x/ y& q' T      在UART实验里,我们用到一个函数,叫putc的函数,如下:  _0 f. C  ~* w+ L* L8 {" p4 K

0 G5 g, D- v# O2 }+ ^; s/*
, n- ^$ u/ q2 @5 n' v; z) q2 t * 发送一个字符; e. z, {5 ?  b5 O- m
*/
5 s5 M7 V" ?) B. Dvoid putc(unsigned char c)
/ A6 j) o' e/ i( V  Z6 J0 P{
5 s  b8 y/ w" D+ \5 M3 }8 l    /* 等待,直到发送缓冲区中的数据已经全部发送出去 */: R: ~4 m9 M  Q( h8 v6 g
    while (!(UTRSTAT0 & TXD0READY));4 A* M& z5 k, @$ U, l* a- @" e! ?# i
- a4 k( m# X$ A4 O$ V4 f
    /* 向UTXH0寄存器中写入数据,UART即自动将它发送出去 */
+ Q9 W5 U- ~9 K7 x8 P. x    UTXH0 = c;4 j* |4 H0 A( e9 O
}' _1 K  c- c  l5 W, ^2 B( `
0 S. S$ l8 w4 z1 Y
# {* _: g6 o9 `; v8 [

6 A- `+ P( k, c1 H% Jputc其实也是属于built-in function,当我们自己想实现这个putc函数的时候就会发生冲突。
7 G9 {2 T$ |) i' P& O
; S' n: |2 c$ ]. {     该怎么解决呢?其实很简单,就是在你编译的时候加上 -fno-builtin  就可以正常编译了。% Z0 b  }# [- F

2 ~, W) u6 r, m  g3 K1 L本UART实验的Makefile修改成如下,即可正常编译:  R8 A2 \. Q$ W" J

/ S1 N4 L1 `8 m) s9 q  [; r5 c- z$ a4 }4 _8 j

# B' }* h- a2 Q5 Tobjs := head.o init.o serial.o main.o) ^% F5 `6 q( a' G8 z4 z

: m6 ~5 q5 m8 ^% muart.bin: $(objs), W; p: M: @+ A7 i  v8 H
ARM-linux-ld -Tuart.lds -o uart_elf $^
$ ~6 i: m  Y3 [6 k# ~: ` arm-linux-objcopy -O binary -S uart_elf $@* g# h2 h# `7 G* K* q3 N
arm-linux-objdump -D -m arm uart_elf > uart.dis
3 ]. C- u  B4 k' G8 C. ?
% M8 A7 u0 Q5 X3 J: e! x%.o:%.c
- g" y. x7 ]: _! u arm-linux-gcc -Wall -O2 -nostdlib -fno-builtin -c -o $@ $<                 //红色为另外添加的信息
; L1 R- O! R, u/ {! w0 H/ }1 b% I3 f7 |& d( j
%.o:%.S) Q, p! V. I8 r1 X6 o2 c+ N; F
arm-linux-gcc -Wall -O2 -nostdlib -fno-builtin -c -o $@ $<  m. T; P, a- ]+ S& F5 u' y! T' r
" f) O5 L: p! z: j& V
clean:
# D. o- ~! q$ S% y8 i8 _" Z rm -f uart.bin uart_elf uart.dis *.o
) H7 h2 S- X4 w6 L3 d+ F0 j: e2 W5 X* R' H- }' Z' U+ V8 J( t

, v; U3 R# z( N; Y# K9 Q: i( Q* m1 C- @( w, o6 V- `2 s0 v% m
-nostdlib9 y; n( U& M( Z1 P2 n- _6 w
9 ?9 B  \, a) O$ D( H
        不连接系统标准启动文件和标准库文件,只把指定的文件传递给连接器。这个选项
2 ?3 ?+ D6 T3 s) U/ T" T' k( r
5 ^! a  H0 ]4 {常用语编译内核、bootloader 等程序,它们不需要启动文件标准库文件。
( p% E3 I: v4 @
! t0 n, n1 X3 o2 J$ T% `# B! i( S; `: L- A, q7 b- [" r

" ~! }. Z! n- \/ Z0 _# \# H
  • 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-10-26 10:14 , Processed in 0.140625 second(s), 24 queries , Gzip On.

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

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

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