【问题标题】:Bazel shared library does not include all symbolsBazel 共享库不包含所有符号
【发布时间】:2021-08-05 02:48:13
【问题描述】:

我正在尝试使用 bazel (mediapipe) 构建一个共享库,并且链接没有源或标头的依赖项无法包含依赖项符号。

这是一个伪代码示例

cc_binary(
    name = "library.so",
    deps = ["//project:dependency"],
    linkshared = 1,
)

其他一些文件:

cc_library(
   name = "dependency",
   srcs = ["file.cc"],
   hdrs = ["file.h"]
)

在文件.h中

class MyClass {
public:
   int abc = 0;
};

那么当我使用 Android 构建时,让我们说

bazel build -c opt --config=android_arm project:framework.so --linkopt="-s"

在我构建后,共享库不包含来自 file.h (MyClass) 的任何符号,使用

nm -D output/framework.so | grep MyClass

有办法吗?我也是bazel的新手。

一个更明确的问题位于 mediapipe 的问题页面。

https://github.com/google/mediapipe/issues/2032

【问题讨论】:

    标签: android c++ cross-compiling bazel mediapipe


    【解决方案1】:

    Unix 链接器通常会删除顶级目标不需要的符号(即"library.so"cc_binary 中的代码)。如果 alwayslink = True 设置在其上,Bazel 将要求链接器在最终顶级链接中强制包含 cc_library 规则中的所有代码。

    【讨论】:

    • 看起来我需要将 alwayslink 添加到很多地方,除非 cc_binary 有办法强制将所有依赖项包含在共享库中?
    • 有一个旧机制可以做到这一点,但alwayslink 是首选:docs.bazel.build/versions/master/…
    猜你喜欢
    • 2014-11-03
    • 2020-04-13
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    • 1970-01-01
    • 2018-06-14
    相关资源
    最近更新 更多