built-in function 错误的解决

在编译嵌入式Linux应用时,遇到关于'putc'内建函数的冲突警告。内建函数如printf无需声明即可使用,但自定义'putc'会导致警告。通过在编译时添加'-fno-builtin'选项,可以避免这种冲突。更新Makefile,添加该选项,使得编译过程顺利进行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值