微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决将 .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 举报,一经查实,本站将立刻删除。