[英]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_library
的deps
中:不起作用,存档链接到应用程序srcs
的cc_library
中:不起作用,存档链接到应用程序linkopts
的cc_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.