zoukankan      html  css  js  c++  java
  • 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_3/

     Demo下载地址: http://www.chungen90.com/?news_2

         

  • 相关阅读:
    2018年7月10日笔记
    2018年7月7日笔记
    2018年7月5日笔记
    2018年7月3日笔记
    sed 命令详解
    《软件构架实践》阅读笔记01
    《掌握需求过程》阅读笔记06
    《掌握需求过程》阅读笔记05
    第十二周进度条
    《掌握需求过程》阅读笔记04
  • 原文地址:https://www.cnblogs.com/wanggang123/p/13955010.html
Copyright © 2011-2022 走看看