Android ndk 编译提示stdin ,stdout, stderr undefine reference

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

 

 

     

 

分类: Android

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值