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/

 

 

     

 

posted @ 2020-11-10 17:30  王纲  阅读(2171)  评论(0编辑  收藏  举报