Android.mk 编译报错undefined reference to

当出现 undefined reference to xxx时, 对应的lib库已经添加到LOCAL_STATIC_LIBRARIES里面 ,且 头文件已经已经添加时,
仍然报 undefined reference to, 请看下面;(下面的两种情况,每一种都是让我百思不得其解,花费将近一天时间才解决的,希望能帮助开发者们!)

1、LOCAL_STATIC_LIBRARIES引用先后顺序问题

  当 LOCAL_STATIC_LIBRARIES 引用了两个有调用关系的静态库的时候,需要把其中被调用的库放在调用者的后面。否则会出现编译报错!
也就是当前模块编译,依赖于 libxxx, libxxx2库,但是 libxxx 又依赖于 libxxx2, 这种情况时 需要对依赖的库的顺序进行调整
LOCAL_STATIC_LIBRARIES := \  
    ...  
    libxxx \
    libxxx2 \
2、   C/C++相互依赖和链接 
gcc和g++编译结果的混用需要保证能够extern "C" 两边都可以使用的接口,在我们的64位环境中gcc链接g++的库还需要加上 -lstdc++,具体见前文对于混合编译的说明 。
那么此时应该在 .h 中添加下面代码进行包裹:
#ifdef __cplusplus
extern "C" {
#endif
xxx code
#ifdef __cplusplus

}

#endif

下面部分内容为从其他博客 摘抄内容:原文链接: 关于Android 链接库时 undefined reference to 的错误分析_麒麟菜籽的专栏-CSDN博客

我们在编译Android JNI的时候,经常要链接一些其他的开源库,我搞了几个项目,总是会碰到undefined reference to的问题,而且会重复被一个问题所困扰,浪费了很多宝贵的时间,经过网上的参考,根据自己的项目实践,今天是想彻底解决了这个问题!

一般编译器报 “undefined reference to”的错误是以下几种情况,Android中的makefile是Android.mk命名的。

1 没有指定对应的库(.o/.a/.so) 

使用了库中定义的实体,但没有指定库(-lXXX)或者没有指定库路径(-LYYY),会导致该错误, 

在Android.mk中 用LDFLAGS参数来定义库(-lXXX)和 (-LYYY)的


2 连接库参数的顺序不对 

在默认情况下,对于-l 使用库的要求是越是基础的库越要写在后面,无论是静态还动态 

我在实际使用的过程中,发现-D参数的使用,也会导致“undefined reference to”的错误,推荐大家如果想在做宏控制的时候,把-D参数放到最后


3 gcc/ld 版本不匹配 
gcc/ld的版本的兼容性问题,由于gcc2 到 gcc3大版本的兼容性存在问题(其实gcc3.2到3.4也一定程度上存在这样的问题) 当在高版本机器上使用低版本的机器就会导致这样的错误, 这个问题比较常见在32位的环境上, 另外就在32位环境不小心使用了64位的库或者反过来64位环境使用了32位的库. 

这个问题与Linux下几乎一样

4 C/C++相互依赖和链接 
gcc和g++编译结果的混用需要保证能够extern "C" 两边都可以使用的接口,在我们的64位环境中gcc链接g++的库还需要加上 -lstdc++,具体见前文对于混合编译的说明 。

在extern “C”的使用时候,因为我经常需要用JNI链接纯C语言的库,我有时候加上extern "C" 还是不行,后来我才发现,extern "C" 必须要包含了头文件,我在这个问题上纠结了很久,惭愧。

5 运行期报错 

这个问题基本上是由于程序使用了dlopen方式载入.so, 但.so没有把所有需要的库都链接上,具体参加上文中对于静态库和动态库混合使用的说明 

关于执行时动态链接的问题,我也碰到过很纠结的情况,就是在Android链接的库依赖于我现在当前的库,就变成了你链接我,我再链接你,导致死都编不过,最好撇清这种关系

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值