在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运行,当它显然是依赖?
谢谢!
答案 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
语句的结果。