make: *** [makefile:59: rtthread.elf] Error 1
编译过程中出现了一个未知错误,不知道咋下手改,求大佬告知
d:/rt-threadstudio/repo/extract/toolchain_support_packages/arm/gnu_tools_for_arm_embedded_processors/5.4.1/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7e-m/fpu\libg.a(lib_a-sbrkr.o): In function `_sbrk_r':
sbrkr.c:(.text._sbrk_r+0xc): undefined reference to `_sbrk'
collect2.exe: error: ld returned 1 exit status
make: *** [makefile:59: rtthread.elf] Error 1
"make -j4 all" terminated with exit code 2. Build might be incomplete.
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有关系,
grep -rsnw _sbrk_r
使用这个命令,观察libg.a中对_sbrk_r的定义:
nm -a arm-none-eabi/lib/libg.a | grep -n _sbrk
使用同样的方法分析c库和nosys库:
nm -a arm-none-eabi/lib/armv7e-m/libc.a | grep -nw _sbrk
nm -a arm-none-eabi/lib/armv7e-m/libnosys.a | grep -nw _sbrk
4.结论:你的某些代码调用了标准c库的接口,从而触发了系统调用的接口,依赖了libnosys.a库。
如果不想揪出是哪个代码触发了syscall,可以尝试链接下libc.a和libnosys.a库试试看;如果是命令行编译环境直接在LDFLAGS添加对应的--specs=nosys.specs;如果是IDE环境,需要找到对应配置链接选项的地方添加进去。
知其然知其所以然,希望答案对你有所帮助。
牛批