Android 编译二进制文件时重建静态库

Android rebuilds static library when the binary is compiled

我在 Android 中有一个二进制文件 link 到静态库 A。静态库 libA 依赖于多个共享库。 二进制文件除了从静态库中导入一个 class 并执行一个简单的函数外什么都不做。

但是,除了我 link 针对静态库 A linked 到的相同共享库之外,二进制文件无法构建,因为编译器试图重新编译 libA 与二进制文件的构建配置。

下面是我的Android.bp静态库:

cc_library_static {
name: "libA",
relative_install_path: "hw",
vendor: true,
rtti: true,
cflags: [
    "-Wall",
    "-Wextra",
    "-g",
    "-DUNIT_TEST",
    "-fexceptions"
],
srcs: [
    "libA.cpp",
],
shared_libs: [
    "libhidlbase",
    "libhidltransport",
    "libutils",
    "liblog"
],
header_libs: [
    "lib_a_stub_headers",
],
whole_static_libs: [
    "lib_a_stub",
],
export_include_dirs: ["."]
}

这是我的 Android.bp 二进制文件:

cc_binary{
name: "simplebinary",
relative_install_path: "hw",
vendor: true,
cflags: [
    "-fexceptions"
],
whole_static_libs: [
    "libA"
],
shared_libs: [
    "vendor.test.hal@1.0",
],
srcs: [
    "simplebinary.cpp",
],
}

二进制文件构建失败:

libA.hpp:4:10: fatal error: 'lib/lib.hpp' file not found

我正在使用命令 mm

进行构建

根据错误消息,编译器无法在其 header 搜索路径中找到 header 文件。 Header 包含在预处理器阶段解决,因此这不是链接问题。预处理器在编译开始时运行,链接在编译结束时完成。

根据您的描述,我了解到 simplebinary 的代码包括由 libA 提供的 header libA.hpp。我知道 libA.hpp 与定义 libA 模块的 Android.bp 包含在同一目录中。因为export_include_dirs: ["."],这个目录被添加到header编译simplebinary的搜索路径中。因此,编译器在编译simplebinary.

时可以找到libA.hpp

现在 libA.hpp 包括 CommonAPI/CommonAPI.hpp。我不知道这个 header 属于哪个图书馆。我假设 header 属于某个库 libB,并且 libA 链接指向 libB。我进一步假设 libB 已将 export_include_dirs 设置为指向包含 CommonAPI/CommonAPI.hpp 的文件夹。然后,您可以通过将 export_shared_lib_headers: ["libB"] 添加到 libA 的模块声明来使 libA re-export 这个 header。如果 libB 不是共享库,则必须改用 export_static_lib_headersexport_header_lib_headers (reference)。