1. 在eclipse中使用gcc-arm-none-eabi-7-2017-q4-major-win32編譯代碼的時候出現了undefined reference to `_sbrk'
e:/proj_1/34_hauwei-baudio/gcc-arm-none-eabi-7-2017-q4-major-win32/bin/../lib/gcc/arm-none-eabi/7.2.1/
../../../../arm-none-eabi/lib/thumb/v6-m\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
2. 經過查找發現是底層的atof函數沒有實現,只有聲明
extern double atof(const char *nptr);
3. 添加上atof的函數原型,從百度搜了一個代碼加進去,問題解決
double atof(const char *s) { double power,value; int i=0; int sign=0; //assert(s!=NULL);//判斷字符串是否為空 //for(i=0;is_space(s[i]);i++);//除去字符串前的空格
sign=(s[i]=='-')?-1:1; if(s[i]=='-'||s[i]=='+')//要是有符號位就前進一位
i++; for(value=0.0;isdigit((int)s[i]);i++)//計算小數點前的數字
value=value*10.0+(s[i]-'0'); if(s[i]=='.') i++; for(power=1.0;isdigit((int)s[i]);i++)//計算小數點后的數字
{ value=value*10.0+(s[i]-'0'); power*=10.0; } return sign*value/power; }
4. 解決過程,剛開始不太懂什么問題,以為是代碼整合有問題,重試了幾次,大致百度下,知道應該是上層應用調用了某個標准的C庫函數,但是底層缺少某個函數,但是一直沒搞明白是gcc-arm-none-eabi-的函數庫缺少這個函數,還是我的代碼缺少這個函數,只能去搜這幾個函數malloc,free,realloc,printf等函數,以為是缺少這幾個函數導致的,然后去搜索整個工程,發現好像沒啥問題。只能從其他方向着手
5. 關鍵這個錯誤提示太變態了,完全看不出導致是少了那個函數啊!然后去gcc-arm-none-eabi-的源代碼里面看了一下,sbrkr.c可惜沒找到這個C文件,有點懵逼,不懂什么幺蛾子,只能用笨辦法一個個C文件硬看,看是不是有啥詭異的函數,遇到覺得可能有毛病的地方都先改着試一試,直到看到這個atof這個函數,想起來以前需要添加這個函數來着,先查一下,是沒有原型,只有聲明,就先加上試試,然后就可以了
6. 總結起來,這個錯誤提示實在是無法聯想到缺少atof函數,這問題不好解決。
