问题描述
Bazel 的 cc_binary 规则有一个 win_def_file 选项,允许在链接 .dll 时使用 .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 (将#修改为@)