|
|
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 ` |
|