在编译《嵌入式Linux应用开发完全手册》的UART实验时候,出现一个以下警告:
serial.h:2: warning: conflicting types for built-in function 'putc'
什么意思呢?首先什么叫built-in function,查阅《C Primer Plus》发现这个叫做内建函数,printf,strchr,memset等等这些函数就是内建函数,这类函数不需要包含头文件中的声明,
就可以编译链接该函数,当你想自己实现一个函数叫printf函数的时候,就会出现冲突的警告。
在UART实验里,我们用到一个函数,叫putc的函数,如下:
/*
* 发送一个字符
*/
void putc(unsigned char c)
{
/* 等待,直到发送缓冲区中的数据已经全部发送出去 */
while (!(UTRSTAT0 & TXD0READY));
/* 向UTXH0寄存器中写入数据,UART即自动将它发送出去 */
UTXH0 = c;
}
putc其实也是属于built-in function,当我们自己想实现这个putc函数的时候就会发生冲突。
该怎么解决呢?其实很简单,就是在你编译的时候加上 -fno-builtin 就可以正常编译了。
本UART实验的Makefile修改成如下,即可正常编译:
objs := head.o init.o serial.o main.o
uart.bin: $(objs)
arm-linux-ld -Tuart.lds -o uart_elf $^
arm-linux-objcopy -O binary -S uart_elf $@
arm-linux-objdump -D -m arm uart_elf > uart.dis
%.o:%.c
arm-linux-gcc -Wall -O2 -nostdlib -fno-builtin
-c -o $@ $< //红 {MOD}为另外添加的信息
%.o:%.S
arm-linux-gcc -Wall -O2 -nostdlib -fno-builtin -c -o $@ $<
clean:
rm -f uart.bin uart_elf uart.dis *.o
-nostdlib
不连接系统标准启动文件和标准库文件,只把指定的文件传递给连接器。这个选项
常用语编译内核、bootloader 等程序,它们不需要启动文件标准库文件。