Android - 未构建LOCAL_STATIC_LIBRARIES中的项目

时间:2015-04-04 01:59:02

标签: android android-source

在AOSP中构建静态库时,我无法构建依赖模块。调用此库A,它依赖于另一个静态库B.

A Android.mk看起来像这样:

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := A
LOCAL_SRC_FILES := <files...>

LOCAL_STATIC_LIBRARIES := B

include $(BUILD_STATIC_LIBRARY)

单独B构建正常(mma)。

问题是当我构建A时,B未构建。相反,我在输出中看到了这一点:

Export includes file: <...>/B/Android.mk -- out/<...>/STATIC_LIBRARIES/B_intermediates/export_includes

有人可以解释一下这行是什么意思吗,为什么不尝试使用B Android.mk来正确构建B?

我理解将静态库打包到另一个内部并不理想,但是在这里我更加清楚为什么构建系统没有通过B的makefile运行,当它显然是依赖?

谢谢!

1 个答案:

答案 0 :(得分:4)

构建系统忽略了许多不相关的语句,LOCAL_STATIC_LIBRARIES就是其中一个例子。他们不会将LOCAL_STATIC_LIBRARIES中的每个条目都写为libA.a的依赖项。相反,他们会解释 Android.mk 文件,为所有目标生成 make 规则,如果出现依赖关系,它最终也会构建。

因此,最简单的解决方法是在 Android.mk 中添加虚拟共享库,例如

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := A
LOCAL_SRC_FILES := <files...>

include $(BUILD_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := dummyA
LOCAL_SRC_FILES := dummy.c

LOCAL_STATIC_LIBRARIES := B

include $(BUILD_SHARED_LIBRARY)

我不确定你是否可以完全放弃LOCAL_SRC_FILES。就良好的旧普通make文件而言,上述内容大致相当于:

all: libA.a libdummyA.so

libdummyA.so: dummy.c libB.a
gcc -o $@ dummy.c -lb

或者,您可以手动指定依赖关系:

$(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libA_intermediates/libA.a: $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libB_intermediates/libB.a

Re: export_includes 消息,它是处理libB的LOCAL_EXPORT_C_INCLUDES语句的结果。