参考博客:
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函数即可,如源码部分把条件编译放开即可,最终结果如下: