解决vendor和frameworks‘libxxx.so already defined‘的编译问题

问题背景:

vendor目录:

sdm845_la2.0/caf/vendor/qcom/proprietary/chi-cdk/vendor/node

frameworks目录:

sdm845_la2.0/caf/frameworks

vendor和frameworks目录下都有预编译模块libxxx,如何解决"libxxx.so already defined"的编译问题?

1 同时打开frameworks和vendor下的预编译libxxx

编译模块libxxx:

source build/envsetup.sh

lunch sdm845-userdebug

make libxxx

出现如下编译错误:

caf/out目录下并没有生成libxxx.so

2 只打开vendor下的预编译libxxx,屏蔽frameworks下的libxxx

编译模块libxxx:

make libxxx       

编译成功

caf/out/.../vendor/...目录下生成libxxx.so

(1)编译libvendor_prj(vendor目录下的工程,链接libxxx.so)

make libvendor_prj

编译成功

也就是说libvendor_prj可以link到vendor下的libxxx.so!!!

(2)编译libframe_prj(frameworks目录下的工程,链接libxxx.so)

make libframe_prj

编译失败:

也就是说libframe_prj不能link到vendor下的libxxx.so!!!

所以问题变为:如何修改frameworks下的Android.mk,使其可以link到vendor目录代码生成的libxxx.so???

(3)尝试修改frameworks下的Android.mk,很久未果;换种思路,尝试修改vendor的libxxx.so生成目录

修改chi-cdk/vendor/node/xxx/common/build/android/Android.mk:

make libxxx

编译成功:

make libframe_prj

编译成功

make libvendor_prj

编译成功

3 只打开frameworks下的预编译libxxx,屏蔽vendor下的libxxx
vendor下的屏蔽:

编译模块libxxx:
make libxxx       
编译成功:caf/out/.../system/...目录下生成libxxx.so
(1)编译libframe_prj
make libframe_prj
编译成功,也就是说libframe_prj可以link到system下的libxxx.so!!!
(2)编译libvendor_prj
make libvendor_prj
编译成功,也就是说libvendor_prj可以link到system下的libxxx.so!!!

4 总结

综上,出现already defined的原因是LOCAL_MODULE:=libxxx被BUILD_PREBUILT了两次。

经实验,frameworks下的代码和vendor下的代码都会链接 caf/out/.../system/...下的libxxx.so

所以解决方法就是:

(1)framework下:BUILD_PREBUILT一次libxxx即可.

(2)vendor下:默认libxxx.so的生成路径即可(caf/out/.../system/...),不要设置libxxx.so的生成路径在caf/out/.../vendor/...下.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值