undefined reference to `__aeabi_unwind_cpp_pr0 问题的解决

undefined reference to `__aeabi_unwind_cpp_pr0’ 问题时上网一查,网上的解决方法大概有两种:
1.
机理
-nostdlib
不连接系统标准启动文件和标准库文件,只把指定的文件传递给连接器。
这个选项常用于编译内核、bootloader等程序,它们不需要启动文件、标准库文件。

C语言程序执行的第一条指令。并不是main函数。生产一个C程序的可执行文件时编译器通常会在我们的代码上加几个被称为启动文件的代码–crt1.o、crti.o、
crtend.o等,他们是标准库文件。这些代码设置C程序的堆栈等,然后调用main函数。他么依赖于操作系统,在裸板上无法执行,所以我们自己写一个。

问题已经找到答案了,我们自己写的crt0.S就是一个启动文件,他设置好堆栈后调用main函数。因此,我们不需要系统自带的启动文件。

2.编译器不对
我解决的办法就是换编译器,之前的arm-linux-gcc是4.3.3编译器,但是我装的交叉编译器记得是4.3.2的版本,因此使用指令“which arm-linux-gcc”发现是4.3.3的,果断修改环境变量,先查看的是vim /root/.bashrc文件,然后再查看vim /profile文件。把暂时不用的arm-linux-gdb都在环境变量中都给注释了,然后使用source /root/.bashrc 和 source /etc/profile 使他们都生效,记得重启linux系统。
然后使用“which arm-linux-gcc ”交叉编译器的版本变为4.3.2,开心,但是make一下自己写的gboot,还是不行,发现都是问题出现在lib/lib.o中,于是查看lib中的Makefile文件,也没问题,突然发现lib目录中有个lib.o,觉得既然这里总出错,不应该出现lib.o文件,于是删除这里的lib.o文件,重新编译一下gboot,果然所有问题都解决了,开心!!(上述问题是在学习国嵌移植串口的printf和scanf时出现的问题,同时也解决了)。
总结一下解决方法2:
(1),编译器版本可能不对;
(2),移植一些函数如prinf和scanf函数时,复制的lib目录中的旧.o文件可以删了。这些删除的.o文件都可以通过该目录中的Makefile文件从新生成的
————————————————
版权声明:本文为优快云博主「daa20」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/daa20/article/details/53507911

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值