【问题标题】:Bazel failed to include a external static library .aBazel 未能包含外部静态库 .a
【发布时间】:2017-12-15 11:09:30
【问题描述】:

-- 问题解决了--

这个问题解决了。感谢大家的帮助!

问题及原因简述如下,供以后的读者参考:

[环境]

Ubuntu 14.04、Bazel、C++

[问题]

我想包含一个外部库。所以我下载了源文件并将其作为静态库.a。

我正确设置了BUILD、WORKSPACE和相关文件。但是,编译时,它会提示错误:

Linking of rule '//main' failed (Exit 1)
main: error: undefined reference to 'void ex_lib::compute(double*, double const*, double const*)'
collect2: error: ld returned 1 exit status

我在这里尝试了 .lo 和 alwayslink 方法,但不起作用。

Alternate to "`--whole-archive`" in bazel

[原因]

这是因为外部库源文件包含重复的头文件。所以我修复了头文件问题。再次制作.a。然后一切正常。

所以 bazel 没什么问题。导致问题的是图书馆本身。但是错误信息比较混乱,我认为是bazel引起的。

【问题讨论】:

    标签: include static-libraries bazel


    【解决方案1】:

    您可以做的进一步调查是使用--subcommands 运行干净的bazel 构建,以查看执行的各个命令行操作。然后你可以cd进入沙箱,执行和bazel一样的gcc命令,调试问题所在。或者您可以尝试通过手写 gcc 命令来获取链接,并将生成的命令 bazel 和您想要的命令都粘贴到此处。您是否有可能在系统上安装了多个 liegroups 库,而 gcc 得到的库与您包含的标头不兼容?

    【讨论】:

    • 感谢您的建议。我在测试期间确实生成了几个谎言组库。但在清理后仍然显示“未定义的引用”,只剩下一个 liegroups 库。
    • gcc命令link命令长什么样子(包括params文件)?
    • 谢谢 mhlopko。问题已经解决了。这是因为 lib 源文件存在缺陷,但它可以编译。现在 bazel 可以很好地处理新生成的 lib 文件。
    【解决方案2】:

    问题解决了。特别感谢 mhlopko。

    主要是lib源文件有错误。因此 .a 我使用的文件包含错误。现在 bazel 可以很好地与新的 lib 文件配合使用。

    顺便说一句,现在 bazel 可以很好地处理我生成的 .a 或 .so 文件。

    【讨论】:

    • 也许你可以直接用这个更新来更新你的问题帖子,让读者更容易将所有元素放在同一个地方:)
    • 感谢您的建议。由于这个问题实际上是由我使用的库引起的,而不是 bazel,因此我将关闭或删除此帖子以避免误导。
    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    相关资源
    最近更新 更多