[bug小记]Android.mk编写中一个小失误引起的吐血事件

这两天要开始写新的应用以及新的NDK层引擎。

最快的方式,当然是把我之前已经写好的、较稳定的NDK和Jni层的android工程直接拷贝过来,然后改下Android.mk里面的参数咯。


但即使这样,即使只是编译一些很简单的c++框架代码,也不能在eclipse工程里面编译通过。

先是重复报了一堆warning:

E:/android-ndk-r9c/build/core/build-binary.mk:388: warning: overriding commands for target `obj/local/armeabi/objs/...  ....o'

E:/android-ndk-r9c/build/core/build-binary.mk:388: warning: ignoring old commands for target `obj/local/armeabi/objs/...  .....o'

接下来是无止境的:

E:/android-ndk-r9c/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld.exe: ./obj/local/armeabi/objs/ ....o: previous definition here

上述刷屏N久后得到的结果是:

collect2.exe: error: ld returned 1 exit status
make.exe: *** [obj/local/armeabi/lib.....so] Error 1


最恶心的是,显示编译链接的进度条在这个地方卡住了,eclipse由此被hang住。折腾了几次之后,eclipse居然各种挂,每次都要野蛮地在task manager中将make.exe进程杀死,并且将eclipse工作目录中的.metadata文件夹删掉,再重新启动eclipse才能再次编译(当然,eclipse的ndk路径和字体设置什么的,也都因为粗暴删除了.metadata而要重新配了)。



在网上搜了下warning和error中关键字,境内中文网页多半只是简单地用中文说了一遍英文错误信息...没有针对我这案例的...而个别貌似有解的境外网站就是各种打不开(也许我太乖...)然后我可能有点不耐烦吧,不再逐句检查我的makefile了(毕竟之前项目中是好用的呀)。然后转方向开始纠结eclipse会挂掉的问题,考虑是不是eclipse升级过没配好啊,是不是这段时间我不小心改了什么环境啊。总之,各种走偏。


终于,在一次郁闷地灌下一大杯温开水后,我开始根据自己在makefile中加入的log信息,检查console中的编译log。最后发现,问题居然是LOCAL_SRC_FILES中有很多重复文件导致的。。。。

因为我是通过MY_SRC_FILES_PATH指定源代码的路径们,然后获取指定路径们之下具体文件们。

# do the recursion search:
MY_ALL_SRC_DIRS := $(dir $(foreach src_path,$(MY_SRC_FILES_PATH), $(call rwildcard,$(src_path),*/) ) )

# delete the same items:

MY_ALL_SRC_DIRS := $(call uniq,$(MY_ALL_SRC_DIRS))

# find the files:
MY_ALL_SRC_FILES := $(foreach src_dir,$(MY_ALL_SRC_DIRS), $(call rwildcard,$(src_dir),*.*) )


其中, rwildcard=$(wildcard $1$2) $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2))


这显然太啰嗦,在给MY_ALL_SRC_DIRS 和MY_ALL_SRC_FILES 赋值时,分别都做了递归查找。

虽然中间调用uniq删除了重复items,但得到的MY_ALL_SRC_DIRS 里面其实是会有以下这种组合case的:

路径A   路径A/a  路径A/b ... (其中路径A/a 和A/b甚至就是在第一次递归查找时由路径A得到的)


于是接下来做第二次递归查找时,路径A下面的所有文件都会被找到,从而跟 路径A/a 和路径A/b中的文件重复了。

当我删除了第一次递归查找过程,或者在最后再加一次call uniq删除重复item。就能编译成功了。


在之前的项目中,由于路径们指定得很细,在最开始就直接指定到a和b级别,正好就避免了文件重复的可能。


以后遇到诡异的问题,还是要多耐心看log,检查哪怕觉得不可能出错的稳定部分。

问题虽然解决了,但比较没想到的是:eclipse编译ndk代码,会这么脆弱,被这种编译错误搞hang掉。。。不知道是不是我对eclipse还不够了解,不懂怎样让它直接就handle掉重复文件的情况。如果各位看官有这方面经验,还请赐教喔~!O(∩_∩)O~


虽然是小bug,却折腾这么久。唉,且行且珍惜吧。。。


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值