【问题标题】:Link archive to shared library with Bazel使用 Bazel 将存档链接到共享库
【发布时间】:2020-04-28 18:14:10
【问题描述】:

使用 Bazel,我想将与位置无关的静态存档直接链接到共享库(而不是使用共享库的应用程序)。比如:

g++ -shared mylib.cpp archive.a -o libmylib.so
g++ mybin.cpp -lmylib -o mybin

基本原理:RedHat 将 libelf 打包为一个静态存档,其中有一些其他公共符号(例如:elf_errmsg)标记为隐藏:存档必须链接到使用它的模块(在本例中为共享库):链接到应用程序为时已晚。

我试过了:

  • 将存档包装在 cc_import 规则中
  • 将规则添加到cc_librarydeps:不起作用,存档会链接到应用程序
  • 将规则添加到cc_librarysrcs:不起作用,存档会链接到应用程序
  • 将存档文件直接添加到cc_librarylinkopts:几乎可以,但是存档会链接到库依赖它的二进制文件。
  • 将存档重命名为.lo.pic.lo:不起作用,存档通过-Wl,wholearchive 链接到应用程序
  • alwayslink = True 添加到cc_import:不起作用,存档通过-Wl,wholearchive 链接到应用程序

【问题讨论】:

    标签: c++ bazel


    【解决方案1】:

    这样的事情应该适用于您正在尝试做的事情:

    cc_binary(
        name = "libmylib.so",
        srcs = ["mylib.cpp", "archive.a"],
        linkshared = True,
    )
    
    cc_library(
        name = "mylib",
        srcs = ["libmylib.so"],
        hdrs = ["mylib.hpp"],
    )
    cc_binary(
        name = "mybin",
        srcs = ["mybin.cpp"],
        deps = [":mylib"],
    )
    

    您可以从您的源代码和库存档中构建一个共享库(以cc_binary(linkshared = True) 完成;这一点可能看起来并不完全直观)。

    您可以构建 cc_library 以用作其他目标的依赖项...并使用它来构建 cc_binary 目标。

    理论上,如果这只是一个时间/地点的事情,你可以像这样缩短它(但它更像是一个最小长度的例子):

    cc_binary(
        name = "libmylib.so",
        srcs = ["mylib.cpp", "archive.a"],
        linkshared = True,
    )
    
    cc_binary(
        name = "mybin",
        srcs = ["mybin.cpp", "mylib.hpp", ":libmylib.so"],
    )
    

    【讨论】:

    • 谢谢。正如在 Bazel Slack 上所讨论的,这似乎是现在唯一的选择。 FTR,较短的版本使得对 lib 的单元测试更加困难。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多