繁体   English   中英

使用 Bazel 将存档链接到共享库

[英]Link archive to shared library with Bazel

使用 Bazel,我想将 position 独立 static 存档直接链接到共享库(而不是使用共享库的应用程序)。 就像是:

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

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

我试过了:

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

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

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"],
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM