[英]Bazel how to build a simple application that links a pre-built external Library
[英]Link to versioned pre-built libraries with bazel
假设供应商提供了预编译的依赖项:
$ ls /opt/vendor/protobuf/lib
libprotobuf.so.3 -> libprotobuf.so.3.0.0
libprotobuf.so.3.0.0
要将其与 Bazel 一起使用,可以创建以下目标:
cc_import(
name = "protobuf",
shared_library = "lib/libprotobuf.3.0.0",
)
这样,bazel 构建的应用程序可以链接到库,但是,它无法启动:
error while loading shared libraries: libprotobuf.so.3: cannot open shared object file: no such file or directory
根本原因是实际的 so 文件有一个自定义SONAME
字段:
objdump -x libprotobuf.so.3.0.0|grep SONAME
SONAME libprotobuf.so.3
加载程序将查找 libprotobuf.so.3(而不是 3.0.0),但不会在沙箱中找到它,因为我们从未告诉 bazel 符号链接。 符号链接是相对的,在 cc_import 目标中指定它会产生类似的错误。
是否可以使用 bazel 创建一个可运行的二进制文件,该二进制文件链接到这样一个应该通过符号链接找到的共享库?
设置 RPATH 可能是一种解决方法。 cc_import 需要由 cc_library 包装:
cc_library(
name = "protobuf",
deps = [":protobuf_impl"],
linkopts = ["-Wl,-rpath=/opt/vendor/protobuf/lib"],
)
cc_import(
name = "protobuf_impl",
shared_library = "lib/libprotobuf.3.0.0",
)
这将使二进制文件运行,但假设每个系统上都存在“/opt/vendor/protobuf/lib”(包括远程执行),并且运行时的加载程序仍然逃离沙箱。 一个更清晰的解决方案会很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.