• android ndk开发爬坑之无法解析的符号


    最近在公司学习ndk开发, 越学越觉得开发java比c/c++幸福多了, 至少java中,编译的时候定位在某一行的错误,那么基本上就是那一行有问题, 然而c/c++确不是这样, 我的开发环境是eclipse;

     1、首先碰到的一个奇葩的问题是:

      Function '__builtin_bswap16' could not be resolved

      这个是使用htons引起的, 搞了半天还是没解决,最后没办法只好在设置里面c/c++General:code Anallysis把这个错误给禁了, 结果成功通过编译, 我日, 我猜测是我的编译有bug,这个东西应该是哪里有定义的,但是编译的时候没找到就直接报错了。如果不理会这个错误,顺利的通过编译,链接的时候是可以找到这个符号的。这是我自己推测的解释, 有人知道的话求留言科普, 灰常感谢。

     

    2、各种东西无法解析

         首先明白的是, 出了我们的编译起鬼畜之外, 几本上这个问题是因为头文件引入不正确引起的, 我开发用的mac,  ndk编程头文件应该是ndk工具目录下, 但是我发现我引入的头文件是在mac系统目录下 /usr/include目录, 如果打开c/c++ Paths and Symbols 的include标签, 可以看到有/usr/include, 我是做ndk开发,虽然mac系统目录下的头文件有些合ndk目录下的是一样的,这也能理解,毕竟mac是 unix like 系统, android使用的linux内核,但是这些文件可能是有区别的,毕竟跨平台可能做了修改,这时候如果我们用系统目录下的头文件,并且用系统的静态库的话,这样是有问题的。

     

    3、 语法没问题,为何编译报错

        这种情况一般是程序别的地方有问题, 检查下include的头文件

     

     

    4、明明包含了头文件, 函数的名字就在里面, 为毛编译还是报未定义的引用?

          undefined reference to

          首先忘了头文件什么的这种事应该不会发生, 那么包含了头文件为什么还会报这个错误呢, 最开始的解决方案是不包含头文件了, 我把.c源文件包含进来, 是的这样确实解决了问题,但是这和心中的编译链接理论说的不一样啊。 想了又想,只能解释为在编译那个源文件的时候, 编译器是采用的c++的符号装饰(这么说高大上一点,也可以说是函数签名, 也就是源代码的函数或者变量最终在目标文件中的名字,这个不同编译器,甚至不同版本的编译器都会不一样), 然而引用那个文件的源文件编译器却是当做c来编译的,所以导致两个地方的名字虽然在源代码中是想同的,但是在实际编译后名字就不同, 因此就出现了符号未定义的问题。 这么猜测后,那么解决办法也就了然于心了, 把那个 被包含的头文件用extern "C"包起来, 结果真的成功了。

     

     

     

     

     

     

     

  • 相关阅读:
    深入剖析RocketMQ源码-NameServer
    Percolator模型及其在TiKV中的实现
    源码解读Dubbo分层设计思想
    vivo营销自动化技术解密|开篇
    Node.js 应用全链路追踪技术——[全链路信息获取]
    Linux系统 usermod -a -G 不重启 立即生效
    安装Docker和Docker-Compose工具
    linux 启动停止jar
    check_ffmpeg_status
    shell 的字符完全匹配
  • 原文地址:https://www.cnblogs.com/zhangyan-2015/p/5667896.html
Copyright © 2020-2023  润新知