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

built-in function 错误的解决

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
在编译《嵌入式Linux应用开发完全手册》的UART实验时候,出现一个以下警告:
9 {/ G! w/ y- \
- a% m9 d" C' |/ Kserial.h:2: warning: conflicting types for built-in function 'putc'
: f+ h  \% J0 b# p
6 k  N/ z9 `0 W0 k
7 M" Q; h, N! I; u3 N
. z6 e0 ^4 r! Q; m) t9 @       什么意思呢?首先什么叫built-in function,查阅《C Primer Plus》发现这个叫做内建函数,printf,strchr,memset等等这些函数就是内建函数,这类函数不需要包含头文件中的声明,
2 A! v$ V* J( A5 s, q( t; ^! q1 |. Z
就可以编译链接该函数,当你想自己实现一个函数叫printf函数的时候,就会出现冲突的警告。
! t! r8 D+ s3 c8 U& A( x/ o5 z, v' D
      在UART实验里,我们用到一个函数,叫putc的函数,如下:+ w6 T- T4 F8 k2 ^8 ?5 ^* d' F

, Q; x. k( ~! o  @/*! s1 a2 q" \) Z, R& K. `% i
* 发送一个字符: V. h* I7 w! M( `% n
*/% J) l# Y) Y; s7 N
void putc(unsigned char c)# {5 a$ o+ N/ W- h' U* {( W4 H" d
{9 X. f! Q6 y- L0 h! E5 n6 `: J
    /* 等待,直到发送缓冲区中的数据已经全部发送出去 */
: e* }: N3 E! d/ T' ^+ K0 N    while (!(UTRSTAT0 & TXD0READY));
: c5 _  h9 s; p8 y) b
, B+ j6 N+ d3 A1 Z4 r  [  A9 t    /* 向UTXH0寄存器中写入数据,UART即自动将它发送出去 */
& n" T+ ~% e  H) t  q  n    UTXH0 = c;, t$ P; X( ^+ a) n: e5 k! M
}' S8 W/ {+ h+ g# T
. t. m4 p* |9 `6 A# N
! i" [& X0 K7 z7 \
( T+ w) o5 N- t* }, q5 s4 j- E
putc其实也是属于built-in function,当我们自己想实现这个putc函数的时候就会发生冲突。5 V# l1 j; Q0 z' t
5 Y6 O, L" ^. R/ d: ^8 U
     该怎么解决呢?其实很简单,就是在你编译的时候加上 -fno-builtin  就可以正常编译了。% [4 f% J. v* B/ L: ], O. p- j( X
* H, g( Q) f. p& I. Q6 z" r
本UART实验的Makefile修改成如下,即可正常编译:
, v& G1 [3 }) L' `5 A) Z. A0 U: h- o" Q$ \. J/ x  q

( o& d5 Q" a! O, O0 w
& S& o! m9 E" H' S! Oobjs := head.o init.o serial.o main.o. D+ V1 ]9 E' N8 }, f
4 Y8 F$ ]7 {/ i3 a
uart.bin: $(objs): I: f; |6 ]3 ~; X( e
ARM-linux-ld -Tuart.lds -o uart_elf $^% F% y+ B/ c" U. t: n/ J! Q" Z
arm-linux-objcopy -O binary -S uart_elf $@2 j( Z4 l$ l( V+ ~+ L
arm-linux-objdump -D -m arm uart_elf > uart.dis, a% C  J, U6 D) o) d
: A7 C! y6 Y5 ~1 z1 l
%.o:%.c
  ^/ w4 T5 ?4 F1 } arm-linux-gcc -Wall -O2 -nostdlib -fno-builtin -c -o $@ $<                 //红色为另外添加的信息0 d1 |3 a" b2 R, _" j- d

7 p6 B' u3 i' e/ T: N, h2 @6 Z9 m, N%.o:%.S( T8 D3 b: P1 @6 W* Q5 d
arm-linux-gcc -Wall -O2 -nostdlib -fno-builtin -c -o $@ $<
" X. ]. t" z, F& |( j: b8 [* F8 \# N/ O6 R& J
clean:/ Y. u) w8 W8 n" E& A
rm -f uart.bin uart_elf uart.dis *.o ' R' P; t' R/ H0 q' {$ g9 U

* `( w" U2 a/ A5 v$ n6 q- o
$ A9 w& o: J% S& C  ], d% e" z2 Z
-nostdlib
4 \! G2 E6 R2 V) x
. K1 ]' z+ S7 W8 H        不连接系统标准启动文件和标准库文件,只把指定的文件传递给连接器。这个选项- H5 J  _+ ^* F+ Z5 O

1 R0 e. ?) w& ?1 `$ B- H: J常用语编译内核、bootloader 等程序,它们不需要启动文件标准库文件。" s* c. U* m: L8 a% P1 ?7 g. N
. E, J; I" K8 x( Z7 K

1 @" U* A5 d" [! U/ }
* s  d- l. u: e% j$ ^4 f7 `
  • 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-25 23:05 , Processed in 0.156250 second(s), 24 queries , Gzip On.

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

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

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