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/?list_53/
Demo下载地址: http://www.chungen90.com/?list_52/