1.从最浅显的编译错误提示“undefined reference to xxx
”
这个错误就是提示你的代码程序在链接的时候,直接(你的代码直接调用)或间接(引用了一些库,库里面调用了)这个xxx函数,在你的错误这里是_sbrk函数;错误的根源是在你的所有代码以及你添加的依赖库里面找不到这个_sbrk函数的实现代码,进而报了链接错误。
2.既然_sbrk_r函数引用了_sbrk,那么我们在rt-thread的源码搜索下这个_sbrk_r试试看:
我们可以看到newlibc里面有对这个函数进行实现,在syscalls.h里面申明,进而推测这个函数可能标准c库及系统调用有关;
3.可以进一步尝试在工具链的目录看下这个libg.a,
使用这个命令找到那些库文件跟_sbrk_r有关系,
使用这个命令,观察libg.a中对_sbrk_r的定义:
使用同样的方法分析c库和nosys库:
4.结论:你的某些代码调用了标准c库的接口,从而触发了系统调用的接口,依赖了libnosys.a库。
如果不想揪出是哪个代码触发了syscall,可以尝试链接下libc.a和libnosys.a库试试看;如果是命令行编译环境直接在LDFLAGS添加对应的—specs=nosys.specs;如果是IDE环境,需要找到对应配置链接选项的地方添加进去。
知其然知其所以然,希望答案对你有所帮助。
牛批