在现有的 aosp 模块上包含预构建的静态库
Include prebuilt static library on existing aosp module
我正在尝试将我的预构建库包含在现有 Android 模块 art/runtime/
中。我按照官方文档,发现here。详细来说,这些是我所做的更改:
在 art/Android.mk 中添加了行:
# This makes sure my library's .mk is found
include $(art_path)/mylib/Android.mk
在 art/runtime/Android.mk:
中添加了行
# Added this, after the LOCAL_C_INCLUDES
LOCAL_STATIC_LIBRARIES := mylib-prebuilt
# Also, on the next mention of LOCAL_STATIC_LIBRARIES, I changed the
# assignment operator to '+=', so mylib won't overriden
包含在 art/runtime.cc
源 mylib 的 header:
#include "mylib.h"
// then at some point use it
我已将 mylib
个来源放入 art/mylib
。我使用常规 Makefile 手动构建存档 libmylib.a
,我想将其静态 linked 为 libart.so
。
在 art/mylib
找到的 Android.mk 我添加了以下内容:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mylib-prebuilt
LOCAL_SRC_FILES := $(LOCAL_PATH)/libmylib.a
LOCAL_EXPORT_C_INCLUDES := \
$(LOCAL_PATH)/mylib.h \
$(LOCAL_PATH)/another_header.h
include $(PREBUILT_STATIC_LIBRARY)
通过导出 C 包含,依赖模块应该已经自动将它们附加到它们的本地列表中。但是,情况并非如此,因为我收到错误:
fatal error: 'mylib.h' file not found
如果我解决这个问题,用我真的不应该的愚蠢方法,我偶然发现了一个 link 错误,因为我的 libmylib.a
在 linking 期间从未使用过.
其他信息:
我已将 mylib
放在 art/mylib
中,因为它将成为 art namespace
的一部分,并且其方法将被 calling/being 由 art/runtime
来源调用,例如runtime.cc
。我选择使用 prebuilt-libraries
,而不是直接包含我的源代码,例如垃圾收集器(位于 art/runtime/gc`),因为我想将特定的编译标志传递给各个源文件。
我已经尝试过,但失败了,找到了其他问题的解决方案 here and here。
有什么想法吗?
编辑:
当我尝试进行完整构建时,出现以下错误:
make: *** No rule to make target
'out/host//obj/STATIC_LIBRARIES/mylib-prebuilt_intermediates/export_includes',
needed by
'out/host//obj/EXECUTABLES/dex2oat_intermediates/import_includes'.
Stop.
谢谢!
我终于成功了。
我的图书馆现在位于 art/runtime/mylib
。
在 art/runtime/Android.mk
中,我包含以下来源:
LOCAL_C_INCLUDES += art/runtime/mylib
这使得 mylib.h
对运行时源文件可见。
art/runtime/mylib/Android.mk
几乎完全更改为:
LOCAL_MODULE := libmylib
LOCAL_SRC_FILES := libmylib.a
LOCAL_MODULE_SUFFIX := .a
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
include $(BUILD_PREBUILT)
在我之前的尝试中,LOCAL_EXPORT_C_INCLUDES
,与文档相反,它没有将文件复制到相关模块。另外 PREBUILT_STATIC_LIBRARY
似乎没有用。
现在,我可以在对象存档中构建我的库,使用常规 makefile,构建系统会在每次更改到适当位置时复制它,因此在 link 阶段可以混合libart.so
.
我正在尝试将我的预构建库包含在现有 Android 模块 art/runtime/
中。我按照官方文档,发现here。详细来说,这些是我所做的更改:
在 art/Android.mk 中添加了行:
# This makes sure my library's .mk is found
include $(art_path)/mylib/Android.mk
在 art/runtime/Android.mk:
中添加了行# Added this, after the LOCAL_C_INCLUDES
LOCAL_STATIC_LIBRARIES := mylib-prebuilt
# Also, on the next mention of LOCAL_STATIC_LIBRARIES, I changed the
# assignment operator to '+=', so mylib won't overriden
包含在 art/runtime.cc
源 mylib 的 header:
#include "mylib.h"
// then at some point use it
我已将 mylib
个来源放入 art/mylib
。我使用常规 Makefile 手动构建存档 libmylib.a
,我想将其静态 linked 为 libart.so
。
在 art/mylib
找到的 Android.mk 我添加了以下内容:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mylib-prebuilt
LOCAL_SRC_FILES := $(LOCAL_PATH)/libmylib.a
LOCAL_EXPORT_C_INCLUDES := \
$(LOCAL_PATH)/mylib.h \
$(LOCAL_PATH)/another_header.h
include $(PREBUILT_STATIC_LIBRARY)
通过导出 C 包含,依赖模块应该已经自动将它们附加到它们的本地列表中。但是,情况并非如此,因为我收到错误:
fatal error: 'mylib.h' file not found
如果我解决这个问题,用我真的不应该的愚蠢方法,我偶然发现了一个 link 错误,因为我的 libmylib.a
在 linking 期间从未使用过.
其他信息:
我已将 mylib
放在 art/mylib
中,因为它将成为 art namespace
的一部分,并且其方法将被 calling/being 由 art/runtime
来源调用,例如runtime.cc
。我选择使用 prebuilt-libraries
,而不是直接包含我的源代码,例如垃圾收集器(位于 art/runtime/gc`),因为我想将特定的编译标志传递给各个源文件。
我已经尝试过,但失败了,找到了其他问题的解决方案 here and here。
有什么想法吗?
编辑: 当我尝试进行完整构建时,出现以下错误:
make: *** No rule to make target 'out/host//obj/STATIC_LIBRARIES/mylib-prebuilt_intermediates/export_includes', needed by 'out/host//obj/EXECUTABLES/dex2oat_intermediates/import_includes'. Stop.
谢谢!
我终于成功了。
我的图书馆现在位于 art/runtime/mylib
。
在 art/runtime/Android.mk
中,我包含以下来源:
LOCAL_C_INCLUDES += art/runtime/mylib
这使得 mylib.h
对运行时源文件可见。
art/runtime/mylib/Android.mk
几乎完全更改为:
LOCAL_MODULE := libmylib
LOCAL_SRC_FILES := libmylib.a
LOCAL_MODULE_SUFFIX := .a
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
include $(BUILD_PREBUILT)
在我之前的尝试中,LOCAL_EXPORT_C_INCLUDES
,与文档相反,它没有将文件复制到相关模块。另外 PREBUILT_STATIC_LIBRARY
似乎没有用。
现在,我可以在对象存档中构建我的库,使用常规 makefile,构建系统会在每次更改到适当位置时复制它,因此在 link 阶段可以混合libart.so
.