使用Bazel与Android NDK编译时静态链接libc++的方法
静态链接Android NDK libc++的解决方案
方法1:修改BUILD文件中的cc_library规则
直接在你的C库规则里添加编译和链接选项,强制静态链接libc,同时确保RTTI启用:
load("@rules_cc//cc:defs.bzl", "cc_library") cc_library( name = "test", srcs = glob(["**/*.cpp"]) + glob(["**/*.hpp"]), hdrs = glob(["**/*.hpp"]), copts = [ "-frtti", # 显式启用RTTI(NDK clang默认可能开启,保险起见加上) "-static-libc++", # 告诉编译器静态链接libc++ ], linkopts = [ "-static-libc++", # 告诉链接器静态链接libc++ ], )
方法2:通过编译命令行全局设置
如果不想改动BUILD文件,编译时直接追加参数即可:
bazel build \ --platforms=@io_bazel_rules_go//go/toolchain:android_arm64_cgo \ --extra_toolchains=@androidndk//:all \ --copt="-frtti" \ --linkopt="-static-libc++" \ //...
验证效果
编译完成后,重新执行readelf -d libtest.so,如果输出里没有NEEDED Shared library: [libc++_shared.so]这一项,就说明静态链接成功了,不需要再分发libc++_shared.so。
注意:静态链接后库文件体积会有所增大,但避免了依赖外部的libc++_shared.so。如果你的代码依赖了只能动态链接的NDK组件,这种方法可能不适用,但常规C++库场景下没问题。
内容的提问来源于stack exchange,提问作者plamkata__
相关产品推荐
相关产品推荐

