问题背景:
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/...下.