Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I prevent linking to the same native library by multiple dependencies?

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)",
]
like image 767
Erik Avatar asked Oct 19 '22 17:10

Erik


1 Answers

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

like image 105
Renato Zannon Avatar answered Oct 23 '22 01:10

Renato Zannon