Android ndk 編譯提示stdin ,stdout, stderr undefine reference


      這個問題在編譯Anddroid版本的PJSip庫出現,找了很長時間的原因,記錄下來,前事不忘,

后事之師。

      編譯主機系統版本是Ubuntu16.04 64位,Android ndk版本為r17c,PJSip庫版本為2.3。

PJSip2.3的configure-android文件與Android ndk r17c 不匹配,參考了網友的帖子修改后

配置成功(后面會將配置文件放到群里,有需要的去群里下載)。然make時總是提示stdin ,

stdout, stderr undefine reference。很顯然,這是連接時編譯器未找到這3個函數的實現。查了下

編譯器鏈接的動態庫:已經加上-lc(這3個函數在libc中實現),檢查了ndk相關目錄(~/Libary/an

droid-ndk-r17c/platforms/android-21/arch-arm/usr/lib:確實存在libc,使用arm-linux-androideabi

-gcc-nm 查看了libc中函數名,也看到了stdin,stdout,stderr,有些百思不得其解。

       函數實現明明存在,卻連接不到,於是懷疑連接時 編譯器找到的是系統庫而非ndk庫(后來證

實這個猜測是錯誤的)。在ndk 庫中找到了stdin,stdout,stderr 定義在頭文件stdio.h 在sysroot/user/

include文件下,相關定義內容如下:

#if __ANDROID_API__ >= __ANDROID_API_M__
extern FILE* stdin __INTRODUCED_IN(23);
extern FILE* stdout __INTRODUCED_IN(23);
extern FILE* stderr __INTRODUCED_IN(23);

/* C99 and earlier plus current C++ standards say these must be macros. */
#define stdin stdin
#define stdout stdout
#define stderr stderr
#else
/* Before M the actual symbols for stdin and friends had different names. */
extern FILE __sF[] __REMOVED_IN(23);

#define stdin (&__sF[0])
#define stdout (&__sF[1])
#define stderr (&__sF[2])
#endif

      這段大概的意思容易理解,為什么這么定義不清楚。 查閱了一些資料搞清楚了一件事情 Android ndk 23

版本后實現了stdin,stdout,stderr 。23版本之前實際時定義為&__sF[0],&__sF[1],&__sF[2]。搞清楚這個

問題就不難解決了,一定是宏定義問題。於是修改配置文件給CFlags加上 -D__ANDROID_API__=21

重新配置后再 make問題得以解決。

 

如需交流可加QQ群766718184,1038388075 或者QQ3501870,

視頻下載地址:http://www.chungen90.com/?news_33/

 Demo下載地址: http://www.chungen90.com/?news_34

 

 

     

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM