【问题标题】:error: native library `openssl` is being linked to by more than one version of the same package错误:本机库`openssl`被同一个包的多个版本链接
【发布时间】:2016-09-27 15:24:33
【问题描述】:

我在尝试构建货物时遇到了这个问题:

错误:本机库openssl 被同一个包的多个版本链接,但只能链接一次;尝试更新或固定您的依赖项以确保此包只显示一次

openssl-sys v0.6.7

openssl-sys v0.7.13

Cargo 和 Rust 版本:

$ cargo --version
cargo 0.11.0-nightly (3ff108a 2016-05-24)

$ rustc --version
rustc 1.11.0-nightly (7746a334d 2016-05-28)

文件:

不明白为什么这不能编译以及如何解决这个问题。 谢谢!

【问题讨论】:

    标签: openssl rust rust-cargo


    【解决方案1】:

    链接的工作方式,您只能链接本地库的单个版本,否则最终会出现重复的符号。 Cargo 的links manifest key 有助于防止您意外链接到同一组符号两次。

    要解决它,您需要通读您的Cargo.lock(这不是一个难以理解的文件格式)。找到将有问题的库作为依赖项的 crate,并注意哪些版本有冲突。

    然后你必须手动解析你的依赖,以便他们的依赖使用相同版本的原生库。


    在这种情况下,依赖链的重要方面是:

    server (0.0.1) => cookie (0.2.4) => openssl (0.7.13)
                   => hyper (0.6.16) => cookie (0.1.21) => openssl (0.6.7)
    

    要修复它,请修改您的 Cargo.toml 以使用与 hyper 相同版本的 cookie。然后你会隐式得到相同版本的openssl。

    说实话,这是目前 Rust 最粗糙的部分之一。至少这个版本的“同一个板条箱的多个不同版本”的奇怪性提供了直接的 Cargo 错误。

    【讨论】:

    • 我刚刚向 cargo-graph 提交了一个pull request 来帮助可视化这种依赖问题。
    • 谢谢,我将所有依赖项都“对齐”在同一个版本中。这是很多黑暗的工作,希望他们能做点什么。
    • 如果我的库绝对需要最新的 openssl,我该怎么办?我正在尝试同时使用 hyper 和 git2,但由于 hyper 需要旧版本的 openssl,所以现在无法构建它。不过,hyper 的依赖项是可选的。有没有办法强制 cargo 使用 git2 所需的版本并将 hyper 视为不存在 openssl?
    • @Machisuji 最好将其作为一个单独的问题提出。但是,如果不需要,您可以使用 Cargo features 禁用 Hyper 的 OpenSSL 依赖项。
    • 谢谢!我创建了一个单独的问题:stackoverflow.com/questions/40824435/…
    猜你喜欢
    • 1970-01-01
    • 2011-03-15
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    相关资源
    最近更新 更多