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"包起来, 结果真的成功了。

 

 

 

 

 

 

 

posted @ 2016-07-13 18:29  章炎  阅读(431)  评论(0编辑  收藏  举报