Android 在编译二进制文件时重建静态库
Android rebuilds static library when the binary is compiled
我在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
的链接。我进一步假设libB
export_include_dirs
设置为指向包含CommonAPI/CommonAPI.hpp
的文件夹。然后,您可以通过将export_shared_lib_headers: ["libB"]
添加到模块声明libA
libA
来重新导出此标头。如果libB
不是共享库,则必须改用export_static_lib_headers
或export_header_lib_headers
(参考(。
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- #为""定义宏;静态";针对不同的上下文
- cmake如何在fedora工作站中找到boost静态库包
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 将公共但非静态的成员函数与ALGLIB集成
- cmake在我的项目中所需的所有静态库都不成功
- C++从另一个类访问公共静态向量的正确方法是什么
- 基于boost的程序的静态链接——zlib问题
- 在静态库中嵌入类方法
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 如何在C++中获得"静态纯虚拟"功能?
- 私有类型的静态常量成员
- 使用gcc从静态链接的文件中查找可选符号
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 如何在C++中使用非静态成员函数作为回调函数
- 将静态库链接到不带-fPIC的共享库中
- Android 在编译二进制文件时重建静态库
- 重建 exe 时如何自动链接新的静态库而不更改源文件?
- Eclipse CDT:如何在没有项目清理>>项目重建的情况下重新链接静态库
- 在多个解决方案之间共享C++静态库会导致不必要的重建