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
语句的结果。
我在 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
语句的结果。