built-in function 错误的解决

     在编译《嵌入式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 $@ $<                 //红色为另外添加的信息

%.o:%.S
 arm-linux-gcc -Wall -O2 -nostdlib -fno-builtin -c -o $@ $<

clean:
 rm -f uart.bin uart_elf uart.dis *.o 

 

-nostdlib

        不连接系统标准启动文件和标准库文件,只把指定的文件传递给连接器。这个选项

常用语编译内核、bootloader 等程序,它们不需要启动文件标准库文件。

 

 

 

你可能感兴趣的:(c,linux,function,嵌入式,makefile,Types)