Skip to content

Doc test link failure with native dependencies #1401

Closed
@dcuddeback

Description

@dcuddeback

This is reopening #681, which was closed by the reporter without a response from the Rust team. In #681, the reporter was able to work around it by forcing static linking, but I don't think that should be a requirement for writing examples in documentation.

When building a crate with native dependencies (such as libusb), the doc tests fail to link because the flags from the build script are not included in the linker command. I distilled it down to a minimal example, which is hosted here: https://github.com/dcuddeback/rust-link-bug

The doc example can be anything. It doesn't have to be related to the native library:

/// Returns the string "hello".
///
/// ```
/// bug::hello(); // returns "hello"
/// ```
pub fn hello() -> &'static str {
  "hello"
}

It seems the only requirement for triggering this bug is to have a links property in Cargo.toml for a library that requires additional linker flags. For this example, I'm linking to libusb-1.0:

[package]

name = "bug"
version = "0.0.1"
authors = ["David Cuddeback <[email protected]>"]

build = "build.rs"
links = "usb-1.0"

I wrote a simple build script to provide the correct flags on my system. This is also the output from using pkg-config-rs on my system, but I wanted to minimize the moving parts in my example.

fn main() {
  println!("cargo:rustc-flags=-L native=/usr/local/Cellar/libusb/1.0.19/lib");
  println!("cargo:rustc-flags=-l usb-1.0");
}

Compiling with cargo build works fine. Running cargo test produces this link error:

failures:

---- hello_0 stdout ----
    error: linking with `cc` failed: exit code: 1
note: "cc" "-m64" "-L" "/usr/local/lib/rustlib/x86_64-apple-darwin/lib" "-o" "/var/folders/7f/z9y9c0gj52gb38jlrsr2pzkc0000gn/T/rustdoctest.uFWruUs3fErH/rust-out" "/var/folders/7f/z9y9c0gj52gb38jlrsr2pzkc0000gn/T/rustdoctest.uFWruUs3fErH/rust_out.o" "-Wl,-force_load,/usr/local/lib/rustlib/x86_64-apple-darwin/lib/libmorestack.a" "-Wl,-dead_strip" "-nodefaultlibs" "/Users/david/src/bug/target/libbug-a0a1f90974336c26.rlib" "-L" "/usr/local/lib/rustlib/x86_64-apple-darwin/lib" "-lstd-4e7c5e5c" "-L" "/Users/david/src/bug/target" "-L" "/Users/david/src/bug/target/deps" "-L" "/usr/local/lib/rustlib/x86_64-apple-darwin/lib" "-L" "/Users/david/src/bug/.rust/lib/x86_64-apple-darwin" "-L" "/Users/david/src/bug/lib/x86_64-apple-darwin" "-lusb-1.0" "-lSystem" "-lpthread" "-lc" "-lm" "-lcompiler-rt"
note: ld: warning: directory not found for option '-L/Users/david/src/bug/.rust/lib/x86_64-apple-darwin'
ld: warning: directory not found for option '-L/Users/david/src/bug/lib/x86_64-apple-darwin'
ld: library not found for -lusb-1.0
clang: error: linker command failed with exit code 1 (use -v to see invocation)

error: aborting due to previous error
thread 'hello_0' panicked at 'Box<Any>', /Users/rustbuild/src/rust-buildbot/slave/nightly-dist-rustc-mac/build/src/libsyntax/diagnostic.rs:151

The directory /usr/local/Cellar/libusb/1.0.19/lib is missing from the linker flags.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions