Android - LOCAL_STATIC_LIBRARIES 中的项目未构建

Android - item in LOCAL_STATIC_LIBRARIES not being built

我在 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,当它显然是一个依赖项时?

谢谢!

构建系统忽略了许多不相关的语句,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 语句的结果。