這個問題在編譯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
