5
votes

Question: How can I work around (or fix) the situation where two dependencies of mine link to the same library, but that library can't be linked twice? This seems like something that would typically be solved with a shared library, but I'm not sure how to approach it with Rust.

Details:

I'm making a web app in Rust using the Nickel framework and rust-postgres for a database. I get the following error when building:

> cargo build
native library `openssl` is being linked to by more than one package, and can only be linked to by one package

  openssl-sys v0.3.3 (https://github.com/sfackler/rust-openssl.git#ee66da60)
  openssl-sys v0.3.3

Looking through Cargo.lock, openssl is referenced by http (which is a dependency of nickel) and rust-postgres.

My Cargo.toml looks like this:

[package]

name = "goodoldweb"
version = "0.0.1"
authors = ["..."]

[dependencies.nickel]
git="https://github.com/nickel-org/nickel.rs.git"

[dependencies.postgres]
git="https://github.com/sfackler/rust-postgres.git"

Here's the full Cargo.lock:

[root]
name = "goodoldweb"
version = "0.0.1"
dependencies = [
 "nickel 0.1.0 (git+https://github.com/nickel-org/nickel.rs.git)",
 "postgres 0.6.1 (git+https://github.com/sfackler/rust-postgres.git)",
]

[[package]]
name = "byteorder"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "gcc"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "groupable"
version = "0.1.0"
source = "git+https://github.com/nickel-org/groupable-rs#efc8d769f611558f086322cd8d2d5ff53314e435"

[[package]]
name = "http"
version = "0.1.0-pre"
source = "git+https://github.com/nickel-org/rust-http.git#1997192b7662ee5bf3bf381bfd9e2aa70f85a545"
dependencies = [
 "openssl 0.3.3 (git+https://github.com/sfackler/rust-openssl.git)",
 "time 0.1.17 (git+https://github.com/rust-lang/time)",
 "url 0.2.18 (git+https://github.com/nickel-org/rust-url.git)",
]

[[package]]
name = "libc"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "libressl-pnacl-sys"
version = "2.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "pnacl-build-helper 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "log"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "matches"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "nickel"
version = "0.1.0"
source = "git+https://github.com/nickel-org/nickel.rs.git#8c2e6a9bdbce0a3ec53d559b86f5060ee1ea6c29"
dependencies = [
 "groupable 0.1.0 (git+https://github.com/nickel-org/groupable-rs)",
 "http 0.1.0-pre (git+https://github.com/nickel-org/rust-http.git)",
 "log 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "nickel_macros 0.0.1 (git+https://github.com/nickel-org/nickel.rs.git)",
 "plugin 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "regex 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)",
 "regex_macros 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
 "rust-mustache 0.3.0 (git+https://github.com/nickel-org/rust-mustache.git)",
 "rustc-serialize 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)",
 "time 0.1.17 (git+https://github.com/rust-lang/time)",
 "typemap 0.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
 "url 0.2.18 (git+https://github.com/nickel-org/rust-url.git)",
]

[[package]]
name = "nickel_macros"
version = "0.0.1"
source = "git+https://github.com/nickel-org/nickel.rs.git#8c2e6a9bdbce0a3ec53d559b86f5060ee1ea6c29"

[[package]]
name = "openssl"
version = "0.3.3"
source = "git+https://github.com/sfackler/rust-openssl.git#ee66da6060c57bc86906261ee3d684fac1fd05e4"
dependencies = [
 "openssl-sys 0.3.3 (git+https://github.com/sfackler/rust-openssl.git)",
]

[[package]]
name = "openssl"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "openssl-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "openssl-sys"
version = "0.3.3"
source = "git+https://github.com/sfackler/rust-openssl.git#ee66da6060c57bc86906261ee3d684fac1fd05e4"
dependencies = [
 "gcc 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
 "libressl-pnacl-sys 2.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "pkg-config 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "openssl-sys"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "gcc 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
 "libressl-pnacl-sys 2.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "pkg-config 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "phantom"
version = "0.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "phf"
version = "0.6.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "phf_shared 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "phf_macros"
version = "0.6.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "phf_shared 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "rand 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "phf_shared"
version = "0.6.6"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "pkg-config"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "plugin"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "typemap 0.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "pnacl-build-helper"
version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "postgres"
version = "0.6.1"
source = "git+https://github.com/sfackler/rust-postgres.git#fe6ae0c63a6e5d66d2afb785605b7d89ec47062d"
dependencies = [
 "byteorder 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "log 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "openssl 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "phf 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "phf_macros 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "rustc-serialize 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)",
 "time 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "rand"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "libc 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "log 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "regex"
version = "0.1.14"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "regex_macros"
version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "regex 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "rust-mustache"
version = "0.3.0"
source = "git+https://github.com/nickel-org/rust-mustache.git#58ed857c88f8e5230913c382034601f37141b4ee"
dependencies = [
 "log 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "rustc-serialize 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "rustc-serialize"
version = "0.2.12"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "time"
version = "0.1.17"
source = "git+https://github.com/rust-lang/time#0960d5e21b332088b04f62117514b0a02fd31259"
dependencies = [
 "gcc 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "time"
version = "0.1.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "gcc 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "typemap"
version = "0.0.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "phantom 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "unsafe-any 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "unsafe-any"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "url"
version = "0.2.18"
source = "git+https://github.com/nickel-org/rust-url.git#5801582b307c16f759b5fe11dec71385af86180c"
dependencies = [
 "matches 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "rustc-serialize 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)",
]
1
Could you post your full Cargo.lock?huon
It seems that the culprit is the fact that nickel-org's rust-http (which is a dependency of nickel) brings in sfackler/rust-openssl instead of the "official" one on crates.io. Unfortunately the rust-http repo doesn't have issues enabled, but I opened one on nickel's main repo: #139Renato Zannon
Renato: That looks like the solution to me, if you put this up as an answer I'll accept it. For now, maybe I'll just make a local fork of http and see if I can swap the dependency out without a major overhaul.Erik
@Erik I don't think you will have a problem swaping the dependency here. It's the same library, just from a different source (github instead of crates.io)Renato Zannon

1 Answers

3
votes

It seems that the culprit is the fact that nickel-org's rust-http (which is a dependency of nickel) brings in sfackler/rust-openssl instead of the "official" openssl on crates.io. Unfortunately the rust-http repo doesn't have issues enabled, but I opened one on nickel's main repo: #139