|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在编译《嵌入式Linux应用开发完全手册》的UART实验时候,出现一个以下警告:
( a: t0 `$ F' T- l8 O7 N/ Q3 b- \! I
serial.h:2: warning: conflicting types for built-in function 'putc'
. a7 \7 p: @6 R/ F8 B# `
( }( ^$ {) U7 A7 x0 X
3 F y* X6 y$ ?/ I
, E4 k3 K0 L( L, C6 Y; @( ~ 什么意思呢?首先什么叫built-in function,查阅《C Primer Plus》发现这个叫做内建函数,printf,strchr,memset等等这些函数就是内建函数,这类函数不需要包含头文件中的声明,
5 P8 k6 x) H6 q8 C7 o; ?# j* h4 Z$ R5 u8 R6 x: L$ V+ \
就可以编译链接该函数,当你想自己实现一个函数叫printf函数的时候,就会出现冲突的警告。. q5 \& U! y& B9 Q1 }1 y+ Z" N
* F: `% L2 {4 _
在UART实验里,我们用到一个函数,叫putc的函数,如下:
" ?, l. X/ R& _( c
" V' R5 d, t: U+ ]/ i: I7 z) S/*
4 W1 s7 T# o% @$ ] * 发送一个字符. n6 B: e5 Q2 K y( {6 c
*/- v/ h7 T: r3 X% G. m0 k, h% S
void putc(unsigned char c)
h0 S; B* g" n3 Y{; j# T# D2 C u' a' c% [* ^% T
/* 等待,直到发送缓冲区中的数据已经全部发送出去 */7 K8 q# u; G. M. a5 o/ Y" N
while (!(UTRSTAT0 & TXD0READY));
. g) D) u" A7 \# Z7 o: \- K% e* w# @0 m
/* 向UTXH0寄存器中写入数据,UART即自动将它发送出去 */
- n7 O. R' g) D4 z% ` UTXH0 = c;7 {" A( v+ [: G$ E
}
2 ^3 ^! _# j9 `3 M; p% u" ^
4 j8 L1 ]" L8 ?' D( |8 e5 X P' O. F6 v7 j; p( P6 c! \
$ Z4 u- U6 B R3 S) T( }9 q/ U
putc其实也是属于built-in function,当我们自己想实现这个putc函数的时候就会发生冲突。" H: v5 I2 k& b' m: F Q
, c1 M9 k) b4 k3 b# |
该怎么解决呢?其实很简单,就是在你编译的时候加上 -fno-builtin 就可以正常编译了。
- q4 n' Q! N4 \ s6 y* r9 F9 w, }( x5 r& a+ [3 S. i" o" [: ~8 f
本UART实验的Makefile修改成如下,即可正常编译:* {" n+ g' L8 e& x0 p1 N
5 m$ l0 G2 c) @( N! {8 B+ b, T# I
; n( H% n; @8 c7 V8 v$ J# F \0 C- R. ~7 B7 u
objs := head.o init.o serial.o main.o
% a( m5 q0 X1 X) i! @$ \9 F! B, F3 b0 F
uart.bin: $(objs)
; h# v- r. P3 |/ ^* f ARM-linux-ld -Tuart.lds -o uart_elf $^* i+ z& Z4 F- R' m ~3 Z
arm-linux-objcopy -O binary -S uart_elf $@0 E! v5 c! k- e9 `
arm-linux-objdump -D -m arm uart_elf > uart.dis
- Z# g# q5 a! _6 B8 `, k+ x% F1 ~3 I
. H. S" r1 y- m$ Z J# Z" G* x%.o:%.c
8 F% S. P( L: p; W* N# ^+ U* j arm-linux-gcc -Wall -O2 -nostdlib -fno-builtin -c -o $@ $< //红色为另外添加的信息1 L3 R- ?* k* u' O" o
5 }1 ^+ ~7 o( U" b9 X! Q* X%.o:%.S, D$ H/ m8 T8 s" `" x9 R1 Q2 r
arm-linux-gcc -Wall -O2 -nostdlib -fno-builtin -c -o $@ $<
& z7 |5 a9 c( H
5 s X- f) y7 m% mclean:/ B d5 T3 \$ W1 D
rm -f uart.bin uart_elf uart.dis *.o
: U/ R1 O x, l( u. u7 s
7 q2 X! h2 r3 [/ m" \9 j- [7 A* e, a- ^8 }, H- J8 A% H: L A+ e
1 T8 F$ v, y% P& r3 [, [
-nostdlib
, K4 u. o1 _! z6 k1 X4 e, u
, q4 @4 D$ ^: |( r5 A( r" k/ } 不连接系统标准启动文件和标准库文件,只把指定的文件传递给连接器。这个选项
9 j2 _( ?9 e- X/ p+ _; f$ q; h
, X$ G" i0 W4 g/ J7 K* a* m常用语编译内核、bootloader 等程序,它们不需要启动文件标准库文件。% ?2 P4 o+ O- E( w9 d# ~6 E. F
% l6 ?( X5 J% C4 C/ Q) T5 `9 g k
2 L7 z6 [- A9 B, M5 y0 h% }6 b
/ N: Z( f+ u; [9 w; K9 ` |
|