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_headers
或 export_header_lib_headers
(reference)。
我在 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_headers
或 export_header_lib_headers
(reference)。