一个令人蛋疼的NDK链接错误
背景
很不科学。
。。核心的Bproject由我维护。整个SO编译project由多个人维护。
于是乎偶进行了一次升级:将B源代码从soproject中解耦:将B打成一个静态库,然后编译So的时候链接静态库。
開始行动
踩雷了
拿到编译出的libB.a,放入engine.so编译project中,改动mk文件,头部增加静态库预编译段,
include $(CLEAR_VARS) LOCAL_MODULE := BModule LOCAL_SRC_FILES := libB.a include $(PREBUILT_STATIC_LIBRARY)
在so编译部分载入BModule模块:LOCAL_STATIC_LIBRARIES := BModule
泪奔了,libB.a和engine.so的编译过程都自我感觉很之良好啊。。。尼玛。仅仅能不断自我打击。暗示一定什么环节出问题了。。
没有crash,文字标注还有,可是底图一直渲染不成功。
。。
排雷的过程
1)将B的源代码放入SO编译project,终于so包没问题。仅仅能怀疑自己的libB.a编译有问题或者链接有问题咯,于是进行第一个尝试:
不直接进行源代码编译。而是通过ndk自带的arm-linux-androideabi-ar.exe工具,将源代码编译时产生的一系列.o文件。手工编译成.a。然后链接这个.a,发现build的so包还是有问题。
source => *.o => engine.so *.o => libB.a => engine.so
ar
上述两种路径:第一条表示源代码编译,ok;第二条是源代码编译的中间结果.o文件。手工通过ar打包成 libB.a。然后链接libB.a,就有问题。
真是见鬼了。!。
2)躲只是了,仅仅能source中添加log,第一次build成libB.a,然后第二次build成engine.so。最后复制到androidproject中。build APK。
source => libB.a => engine.so => apk.
整个蛋疼的定位过程得益于windows的批处理脚本。能够实现半自己主动化。
不断反复这个过程,不断调整log精度。终于定位究竟图瓦片绘制失败的问题:坐标转化函数GetGeoRect的结果错误。导致绘制时候取不到数据。
定位问题的解决办法
。说明libB.a内这些函数本身没有问题。
问题出在so包的链接阶段。
跟组内一经验丰富的哥们讨论,那天恰好周五。下班前还是没结果。。
。晚上回去后回一直在回忆编译的整个过程。想起他无心的一句话:“是不是可能有反复的定义啥的“。最终想到了一个问题,Aproject里面Bproject的两个头文件。当时为了解耦其它人将两个头文件反复拷贝了一份,(明显触犯了DRY原则)例如以下, yy.h中包括了静态函数的GetGeoRect定义,vv.h中包括了render_config_t结构体定义,而GetGeoRect中使用了render_config_t结构体。
我近期一次B模块升级。更新了vv.h中的render_config_t结构体,内部添加了一个256的char数组。
。
附图新旧vv.h头文件里的render_config_t结构体:
旧的:新的:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcnlmZGl6dW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
第二天周六,按耐不住奔到公司,更新A模块中的vv.h头文件,build出的so包最终正确了。
总算是找到问题所在了:
A和Bproject中的vv.h和yy.h文件反复。B中vv.h文件近期被更新过。
1)当A、Bproject均採用源代码编译时,终于SO中的GetGeoRect函数内部使用了最新的render_config_t结构体布局(编译器可能依据文件的改动时间等等作为比对条件吧?),因此底图绘制正确。
2)可是当Bprojectbuild成静态库libB.a时。此时build成SO时,GetGeoRect函数定义採用了Aproject中源代码(编译器可能更加信赖源代码吧)。因此render_config_t也採用了旧的内存布局。因此当调用SO执行时。传入GetGeoRect函数的render_config_t的对象採用最新的内存布局,可是内部实际上是按旧的结构体解析和执行,当然结果就全然错了。
一句话总结问题
附录
一个令人蛋疼的NDK链接错误的更多相关文章
- 一个令人蛋疼的 Microsoft.AspNet.FriendlyUrls
我一个项目都基本上做完了,结果部署到我服务器的时候结果一直报404 找不到 一看global.asax有个路由注册的代码 public static void RegisterRoutes(Route ...
- 使用NDK r10构建Cocosd-x v3.2时编译和链接错误的解决办法
如果你使用NDK r10构建Cocos2d-x v3.2,将会遇到所有测试用例编译错误以及Lua测试用例链接错误. 1. 编译错误 错误信息是: 1 2 3 4 5 6 7 8 /Users/ming ...
- 模板函数(template function)出现编译链接错误(link error)之解析
总的结论: 将template function 或者 template class的完整定义直接放在.h文件中,然后加到要使用这些template function的.cpp文件中. 1. 现 ...
- C++常见gcc编译链接错误解决方法
除非明确说明,本文内容仅针对x86/x86_64的Linux开发环境,有朋友说baidu不到,开个贴记录一下(加粗字体是关键词): 用“-Wl,-Bstatic”指定链接静态库,使用“-Wl,-Bdy ...
- 关于ios 程序加载百度地图lib,出现链接错误:找不到符号 (null): _OBJC_CLASS_$_BMKMapManager的解决办法
报告的错误信息 ld: warning: ignoring file /Users/5012/Documents/sphuang/IOS_project/baidu_map/ShareLocation ...
- Treat wchar_t as built-in type不一致导致的链接错误
今天用VS2013新建了一个工程,生成时出现很多怪异的链接错误,比如: error LNK2019: unresolved external symbol "__declspec(dllim ...
- VS编程常见的编译和链接错误
常见错误1: Error 2 error LNK1120: 1 unresolved externals Error 1 error LNK2019: unresolved external symb ...
- Duplicate Symbol链接错误的原因总结和解决方法[转]
from:http://www.cocoachina.com/bbs/read.php?tid=177492 duplicate symbol是一种常见的链接错误,不像编译错误那样可以直接定位到问题的 ...
- [问题记录]libpomelo工程调整编译链接错误
1. 描述: 如下图所示,出现链接错误.那么链接问题一般也就两块设置: (1)包含路径Additional Library Directories (2)lib库的包含Additional Depen ...
随机推荐
- [APIO2009]会议中心(贪心)
P3626 [APIO2009]会议中心 题目描述 Siruseri 政府建造了一座新的会议中心.许多公司对租借会议中心的会堂很 感兴趣,他们希望能够在里面举行会议. 对于一个客户而言,仅当在开会时能 ...
- 【Henu ACM Round#19 D】 Points on Line
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 考虑l..r这个区间. 且r是满足a[r]-a[l]<=d的最大的r 如果是第一个找到的区间,则直接累加C(r-l+1,3); ...
- 洛谷 P1176 路径计数2
P1176 路径计数2 题目描述 一个N×N的网格,你一开始在(1, 1),即左上角.每次只能移动到下方相邻的格子或者右方相邻的格子,问到达(N, N),即右下角有多少种方法. 但是这个问题太简单了, ...
- 隐马尔科夫模型(HMM)
基本概念 1Markov Models 2Hidden Markov Models 3概率计算算法前向后向算法 1-3-1直接计算 1-3-2前向算法 1-3-3后向算法 4学习问题Baum-Welc ...
- 【Oracle错误集锦】:ORA-00119 & ORA-00132
有时候老天就是爱和你开玩笑,昨天好不easy配置好Oracle.可以用PL/SQL正常登录使用,今天突然就不行了.而且错误十分诡异,没有提示什么错误代码.输入usernamepassword,点击登录 ...
- Android导航Tab栏实现
前言 android中滑动控件非常多,相信大部分同学接触的都是ListView这样的竖向滑动的控件,可是有时候我们也有横向滑动的需求,非常多应用眼下也做成了这个样子,以weiciyuan为例,例如以下 ...
- Simditor用法
一不小心接触到Simditor,瞬间被它优美极简的界面所吸引.Simditor是Tower开源的所见即所得的在线富文本编辑器. Simditor的理念是保持简单,避免过度的功能,每个特性都追求极致的用 ...
- BZOJ5204: [CodePlus 2018 3 月赛]投票统计
[传送门:BZOJ5204] 简要题意: 有n个选手,每个选手会选择一道题投票,求出投票最多的题目个数和这些题目的编号,如果所有题目的投票数相同,则输出-1 题解: 直接搞 离散化,然后判断就可以了 ...
- Lesson 1 Basic Concepts: Part 2
Getting your web site ‘live’ on the Web With the nerd background details under our belts, we can now ...
- VS 2015支持C语言和C++程序
先要安装C++的相关支持控件! 然后就可以使用VS编写C++或者C程序了. 默认支持的是C++,将后缀名改为C就是支持C了. 学习数据结构算法之类的,就可以通过VS来学习了. 安装 新建C++项目 C ...