如何控制从 Bazel 中的共享库导出哪些符号?

卡尔马留斯

我正在学习 Bazel,因为我必须在工作中使用它。我有一个简单的构建规则,它从单个文件创建一个库,我想通过使用链接器版本文件来控制链接器导出的内容。(我在 Linux 上)

所以我试过:

cc_library (
    name ="thelib",
    srcs = ["lib.cpp"],
    linkopts = ["-Wl,--version-script,lib.ver"]
)

它告诉我“没有这样的文件或目录”。

我试过什么:

  • 我尝试了一个相对于我发出 bazel build 命令的目录的路径,但无济于事。
  • cc_library() 的文档说“linkopts”支持 make 变量替换,所以我列出了 make 变量,bazel info --show_make_env它向我展示了一个名为的变量workspace,然后我尝试了,$(workspace)/lib/lib.ver但后来它说$(workspace) not definedBazel 是个骗子。
  • 唯一有效的是拼写链接器脚本的绝对路径,但我不想推动它。
  • cc_library() 有一个 win_def_file 选项,但你猜怎么着,那只是 Windows。
  • 一个自关闭的 github 问题表明我应该将文件名作为单独的参数传递,它也不起作用。
  • Using -fvisiblity=hiddenand export using __attribute__to export 不是一个选项,因为标准 C++ 库会覆盖它并强制导出您不想出现在界面上的符号(该库仅使用 extern "C" 界面使用我不想要任何其他垃圾出现在其上)。
  • Bazel 中似乎没有选项可以指定要本地导出的符号。

在这一点上,我完全没有想法了。任何帮助表示赞赏。

本杰明·彼得森

首先,共享库通常cc_binary与其linkshared属性一起声明,而不是cc_library这是违反直觉的,但反映了cc_binarycc_library声明中间库的同时创建传递链接的意图(喜欢冒险的人可以试试cc_shared_library

其次,可以通过linkoptsdeps.

所以,一起来:

cc_binary(
   name = 'mylib.so',
   linkshared = True,
   srcs = ['mylib.cc'],
   linkopts = ['-Wl,-version-script=$(location version-script.lds)'],
   deps = [
      'version-script.lds',
   ]
)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章