【编译错误】:对‘__aeabi_idivmod未定义的引用‘,对‘__aeabi_idiv‘未定义的引用

参考博客:

解决undefined reference to `__aeabi_uidivmod\'和undefined reference to `__aeabi_uidiv\'错误-草根老师-ChinaUnix博客自己写裸机驱动程序时,使用了除法,在链接的时候出了如下错误:  使用的编译器是:  后来上网搜了一下原因,由于编译器不支持除法运算,但是也没有搜到解决方案。看了一下icon-default.png?t=M1L8http://blog.chinaunix.net/uid-26833883-id-3282967.html

1. 问题背景及源码

最近调试代码的时候遇到了以下的编译问题,查看网上的解决方法顺利解决,顺便自己记录一下

//#include <stdio.h>
/* in case compiler error */
#if 0
int raise(int param)
{
    return 0;
}
#endif

int mod(int a, int b)
{
    return (a % b);
}

int div(int a, int b)
{
    return (a / b);
}

int main(void)
{
    int a = 10;
    int b = 3;
    int c = 0;
    int d = 0;
    c = mod(a, b);
    d = div(a, b);
    return 0;
}

2. 问题原因

问题的原因其实报错信息中已经说出来了,在mod与div函数中使用了求余%与除法/运算,而编译器不支持上述两种运算,导致链接的时候找不到定义而报错

3. 解决方法

需要链接gcc库即可解决

如下是路径,只要在Makefile中指定即可

.PHONY:all
TARGET:=test
LDFLAGS:= -lgcc -L/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/lib/gcc/arm-linux-gnueabihf/4.9.4
objects = start.o main.o

all:$(TARGET).bin

$(TARGET).bin:$(objects)
	#arm-linux-gnueabihf-ld -Timx6u.lds -o $(TARGET).elf $^
	arm-linux-gnueabihf-ld -Timx6u.lds -o $(TARGET).elf $^ $(LDFLAGS)
	arm-linux-gnueabihf-objcopy -O binary -S $(TARGET).elf $@

%.o:%.c
	arm-linux-gnueabihf-gcc -nostdlib -c -o $@ $<

%.o:%.s
	arm-linux-gnueabihf-gcc -nostdlib -c -o $@ $<
	
clean:
	-rm -rf *.o *.bin *.elf *.imx

4. 新的报错

按照上述的改法链接的库以后,又出现了新的报错如下:

对raise函数未定义的引用

 解决方法是我们自己实现一个raise函数即可,如源码部分把条件编译放开即可,最终结果如下:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值