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

Android rebuilds static library when the binary is compiled

本文关键字:重建 静态 二进制文件 编译 Android      更新时间:2023-10-16

我在Android中有一个二进制文件,它链接到静态库A.静态库libA依赖于多个共享库。 二进制文件除了从静态库中导入类并执行简单函数外,不执行任何操作。

但是,二进制文件无法构建,除非我链接到静态库 A 链接到的相同共享库,因为编译器尝试使用二进制文件的构建配置重新编译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构建

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

从您的描述中,我了解到simplebinary的代码包括标头libA.hpp,由libA提供。我知道libA.hpp与定义libA模块的Android.bp包含在同一个目录中。由于export_include_dirs: ["."],该目录被添加到标头搜索路径中,用于编译simplebinary。因此,编译器在编译simplebinary时可以找到libA.hpp

现在libA.hpp包括CommonAPI/CommonAPI.hpp。我不知道这个标题属于哪个库。我假设标头属于某个库libB,并且libA针对libB的链接。我进一步假设libBexport_include_dirs设置为指向包含CommonAPI/CommonAPI.hpp的文件夹。然后,您可以通过将export_shared_lib_headers: ["libB"]添加到模块声明libAlibA来重新导出此标头。如果libB不是共享库,则必须改用export_static_lib_headersexport_header_lib_headers(参考(。