将 .dll 与 Bazel 链接时如何使用 .exp 文件?

问题描述

Bazel 的 cc_binary 规则有一个 win_def_file 选项,允许在链接 .dll 时使用 .def 文件

然而,.def 文件只能添加到导出中,而不能从中删除

因此,如果过分热心的第三方库的代码对其任何函数使用 declspec(dllexport),那么该函数将被导出,从而污染导出表。

为了避免这种情况,可以编写一个具有确切导出集的 .def 文件,然后使用 MSVC 的 LIB 工具生成导入 .lib 和 .exp 文件。然后将 .exp 文件而不是 .def 文件传递​​给链接器。这会导致链接生成您想要的导出并丢弃您不想要的导出。

所以我制定了一个 genrule 来调用 LIB 工具来生成 .lib 和 .exp。

但是 Bazel 不知道 .exp 文件并根据文件扩展名拒绝它们,所以我试图作弊,并使用 .obj 扩展名制作了一个副本并将其添加到 cc_binary 目标的 srcs 中。 这应该可以工作,因为 cl.exe 和 link.exe 都接受它作为输入。

编译基本正常,除了这些 Bazel 错误外,我得到了带有适当导出的 DLL:

LINK : warning LNK4052: using .EXP file; ignoring .DEF file 'bazel-out/x64_windows-opt/bin/src/source/mylibCore/mylibcore.dll.gen.empty.def'
Generating code
Finished generating code
ERROR: C:/users/calmarius/gitroot/mylib/src/source/mylibCore/BUILD:156:10: output 'src/source/mylibCore/mylibcore.dll.if.lib' was not created
ERROR: C:/users/calmarius/gitroot/mylib/src/source/mylibCore/BUILD:156:10: Linking src/source/mylibCore/mylibcore.dll Failed: not all outputs were created or valid

事实证明,当您使用导出文件时,MSVC 的链接程序不会生成导入库,因为它假定您已经有了一个(使用 LIB 工具生成的那个)。

现在我卡住了。有没有办法告诉 Bazel 不要期望导入 lib 或使用我已经拥有的 lib?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)