如何控制从 Bazel 中的共享库导出哪些符号?
How can I control what symbols are exported from a shared library in Bazel?
我正在学习 Bazel,因为我必须在工作中使用它。我有一个简单的构建规则,它从单个文件创建一个库,我想通过使用链接器版本文件来控制链接器导出的内容。 (我在 Linux)
所以我尝试了:
cc_library (
name ="thelib",
srcs = ["lib.cpp"],
linkopts = ["-Wl,--version-script,lib.ver"]
)
它告诉我“没有这样的文件或目录”。
我尝试了什么:
- 我尝试了一个相对于我发出 bazel build 命令的目录的路径,但没有成功。
- cc_library() 的文档说“linkopts”支持 make 变量替换,所以我列出了带有
bazel info --show_make_env
的 make 变量,它显示了一个名为 workspace
的变量
所以我然后尝试 $(workspace)/lib/lib.ver
但后来它说 $(workspace) not defined
所以 Bazel 是个骗子。
- 唯一可行的是拼写链接描述文件的绝对路径,但我不想推送它。
- cc_library() 有一个 win_def_file 选项,但你猜怎么着,那只是 Windows。
- A self-closed github issue 建议我应该将文件名作为单独的参数传递,它也不起作用。
- 使用
-fvisiblity=hidden
和使用 __attribute__
导出不是一个选项,因为标准 C++ 库会覆盖它并强制导出您不想出现在界面上的符号(仅使用 extern "C" 接口使用库,我不希望其上出现任何其他垃圾)。
- Bazel 中似乎没有指定要本地导出的符号的选项。
至此我完全运行没思路了。感谢任何帮助。
首先,共享库通常使用 cc_binary
与其 linkshared
属性一起声明,而不是 cc_library
。这是违反直觉的,但反映了 cc_binary
创建可传递 link 而 cc_library
声明中间库的意图。 (更有冒险精神的人可以试试 cc_shared_library
其次,可以通过在 linkopts
中使用版本脚本(和其他 linker 脚本)并在 deps
中将它们声明为依赖项来使用它们。
所以,一起:
cc_binary(
name = 'mylib.so',
linkshared = True,
srcs = ['mylib.cc'],
linkopts = ['-Wl,-version-script=$(location version-script.lds)'],
deps = [
'version-script.lds',
]
)
我正在学习 Bazel,因为我必须在工作中使用它。我有一个简单的构建规则,它从单个文件创建一个库,我想通过使用链接器版本文件来控制链接器导出的内容。 (我在 Linux)
所以我尝试了:
cc_library (
name ="thelib",
srcs = ["lib.cpp"],
linkopts = ["-Wl,--version-script,lib.ver"]
)
它告诉我“没有这样的文件或目录”。
我尝试了什么:
- 我尝试了一个相对于我发出 bazel build 命令的目录的路径,但没有成功。
- cc_library() 的文档说“linkopts”支持 make 变量替换,所以我列出了带有
bazel info --show_make_env
的 make 变量,它显示了一个名为workspace
的变量 所以我然后尝试$(workspace)/lib/lib.ver
但后来它说$(workspace) not defined
所以 Bazel 是个骗子。 - 唯一可行的是拼写链接描述文件的绝对路径,但我不想推送它。
- cc_library() 有一个 win_def_file 选项,但你猜怎么着,那只是 Windows。
- A self-closed github issue 建议我应该将文件名作为单独的参数传递,它也不起作用。
- 使用
-fvisiblity=hidden
和使用__attribute__
导出不是一个选项,因为标准 C++ 库会覆盖它并强制导出您不想出现在界面上的符号(仅使用 extern "C" 接口使用库,我不希望其上出现任何其他垃圾)。 - Bazel 中似乎没有指定要本地导出的符号的选项。
至此我完全运行没思路了。感谢任何帮助。
首先,共享库通常使用 cc_binary
与其 linkshared
属性一起声明,而不是 cc_library
。这是违反直觉的,但反映了 cc_binary
创建可传递 link 而 cc_library
声明中间库的意图。 (更有冒险精神的人可以试试 cc_shared_library
其次,可以通过在 linkopts
中使用版本脚本(和其他 linker 脚本)并在 deps
中将它们声明为依赖项来使用它们。
所以,一起:
cc_binary(
name = 'mylib.so',
linkshared = True,
srcs = ['mylib.cc'],
linkopts = ['-Wl,-version-script=$(location version-script.lds)'],
deps = [
'version-script.lds',
]
)