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

built-in function 错误的解决

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
在编译《嵌入式Linux应用开发完全手册》的UART实验时候,出现一个以下警告:; a' f& x- A: ~0 M5 K- }

0 n/ o" l4 k* o, O/ ]/ l8 tserial.h:2: warning: conflicting types for built-in function 'putc'
5 g8 p# b# `; i, b$ b3 R5 \
* k- X0 j3 Z' ?, z0 w! e! a# O
. ^0 K3 I9 l/ p% h% n+ \0 @3 D: K7 H' l# e7 [
       什么意思呢?首先什么叫built-in function,查阅《C Primer Plus》发现这个叫做内建函数,printf,strchr,memset等等这些函数就是内建函数,这类函数不需要包含头文件中的声明,# O: Y9 J3 a9 {- G0 _5 ?
5 Z2 K6 q$ I9 G
就可以编译链接该函数,当你想自己实现一个函数叫printf函数的时候,就会出现冲突的警告。# {. o" {" s! S& G5 [

+ O3 ^" S: e* ]/ [( @' \  V+ @$ u      在UART实验里,我们用到一个函数,叫putc的函数,如下:
2 K! y) [+ j: C9 Z! U$ j+ B8 c
# ?$ `* y  e+ ^3 z+ H/*3 i7 s/ K) j# c; j
* 发送一个字符
& [* ~7 r5 j( v$ J1 |  j */& ^8 o1 ^' L. M: X
void putc(unsigned char c)+ Y# G  C0 p9 [
{( s8 d5 F& o' g/ X+ t1 B
    /* 等待,直到发送缓冲区中的数据已经全部发送出去 */
  l' f- @" |6 `# S2 p# f" a    while (!(UTRSTAT0 & TXD0READY));
8 X7 b4 F8 l9 l! Y$ q0 r0 o/ J4 l, f" k8 {- n$ O
    /* 向UTXH0寄存器中写入数据,UART即自动将它发送出去 */& R* V6 j) A* V1 G7 @6 `
    UTXH0 = c;
  k. }! k; g; X- s  ~8 ~0 n9 U& x. [- o}
, B% p. @* N0 N4 ?2 A2 [
" \& k  Q# \3 o6 T, f  ]
1 S& S; m% v* ~6 m- W/ i7 c
6 `: j* r$ z0 y/ U, h. qputc其实也是属于built-in function,当我们自己想实现这个putc函数的时候就会发生冲突。. D  N. P. O- a! f+ {

+ [  \, q9 t( @% ^" t- P/ V) F5 h     该怎么解决呢?其实很简单,就是在你编译的时候加上 -fno-builtin  就可以正常编译了。" W9 A! G' b. J

7 w2 K. R' g8 K  \5 Y3 {, q1 s本UART实验的Makefile修改成如下,即可正常编译:' V6 ]# S9 E' R

  @* P/ j2 E, ^% @3 s
2 Z% U3 }. P) Z7 m7 t% z  @& B' a6 ^
objs := head.o init.o serial.o main.o5 k6 g9 L7 O1 a3 n8 a
. ~* i9 j( h: f7 a3 |8 c* W
uart.bin: $(objs)
$ b3 Q7 Q) ~1 m  n. `8 t% n ARM-linux-ld -Tuart.lds -o uart_elf $^5 v2 `/ X3 y5 |% y/ e3 a
arm-linux-objcopy -O binary -S uart_elf $@4 @7 i/ [* `, z" `' V
arm-linux-objdump -D -m arm uart_elf > uart.dis
. H" e6 t& s/ w4 m/ c& \  R5 ~6 j; b' ^0 \
%.o:%.c
2 g( V$ h( W0 i1 | arm-linux-gcc -Wall -O2 -nostdlib -fno-builtin -c -o $@ $<                 //红色为另外添加的信息
+ h0 E. [) X  [6 H; u$ s& X8 q9 g+ @7 A( ]$ F
%.o:%.S
; P6 F! N2 D  {$ X' R8 T arm-linux-gcc -Wall -O2 -nostdlib -fno-builtin -c -o $@ $<+ g* b/ X" r1 O, m+ D4 |2 V
, n7 `! e) y% `8 A- w1 o
clean:
4 K6 {$ u. `0 n! K1 T rm -f uart.bin uart_elf uart.dis *.o
! g) o& w! w- _. K) ~8 i$ N; z
) m+ @- p" L6 o4 f4 E, o

7 v* v2 l3 Z8 u-nostdlib$ B" T/ P' @& D0 y

0 V' u2 S* C6 P# y        不连接系统标准启动文件和标准库文件,只把指定的文件传递给连接器。这个选项" v- Y1 ~& O8 Q' ~% Z% |

# E% J4 p1 e  Q常用语编译内核、bootloader 等程序,它们不需要启动文件标准库文件。
& Z9 q/ p: u+ X' S- u3 G: D9 H& E. u! S! s. ?( h
$ K$ K1 K: U& p; Y1 s9 m* o0 J" F
# P7 L5 r6 H. ]4 T: r
  • 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-7-1 16:58 , Processed in 0.093750 second(s), 23 queries , Gzip On.

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

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

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