built-in function 错误的解决

2019-07-12 23:52发布

     在编译《嵌入式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 等程序,它们不需要启动文件标准库文件。