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