title: How can I link libraries to my C code and use that in a Rust binary?
body: <p>I am trying to include a C file in my Rust project. The C file uses system dependencies. Below is a minimal example that does not compile when I run <code>cargo build</code>.</p>
  
  <p>If I take the failing command that Cargo is running and I append <code>"-l" "nl-genl-3" "-l" "nl-3"</code> the command <em>does</em> succeed. Is it putting the the linker flags in the wrong place, because those flags definitely <em>are</em> in the command?</p>
  
  <p><strong>src/main.rs</strong></p>
  
  <pre><code>#[link(name = "nl-genl-3")]
  #[link(name = "nl-3")]
  extern "C" {
      fn nl_test(help_me_pls: usize) -&gt; usize;
  }
  
  fn main() {
      unsafe {
          println!("nl.c function result: {:?}", nl_test(6));
      }
  }
  </code></pre>
  
  <p><strong>src/nl.c</strong></p>
  
  <pre class="lang-c prettyprint-override"><code>#include &lt;linux/nl80211.h&gt;
  #include &lt;netlink/netlink.h&gt;
  #include &lt;netlink/genl/genl.h&gt;
  
  int nl_test(int help_me_pls) {
      struct nl_sock* socket = nl_socket_alloc();
      nl_socket_free(socket);
      return help_me_pls;
  }
  </code></pre>
  
  <p><strong>build.rs</strong></p>
  
  <pre><code>extern crate cc;
  
  fn main() {
      cc::Build::new()
          .include("/usr/include/libnl3")
          .file("src/nl.c")
          .compile("libnl.a");
  }
  </code></pre>
  
  <p><strong>Cargo.toml</strong></p>
  
  <pre><code>[package]
  name = "derp"
  version = "0.1.0"
  
  [build-dependencies]
  cc = "1.0"
  </code></pre>
  
  <p>I get the following output when I run <code>cargo build</code></p>
  
  <pre class="lang-none prettyprint-override"><code>   Compiling cc v1.0.18
     Compiling derp v0.1.0 (file:///root/derp)
  error: linking with `cc` failed: exit code: 1
    |
    = note: "cc" "-Wl,--as-needed" "-Wl,-z,noexecstack" "-L" "/root/.rustup/toolchains/stable-armv7-unknown-linux-gnueabihf/lib/rustlib/armv7-unknown-linux-gnueabihf/lib" "/root/derp/target/debug/deps/derp-5a7445c256565e2d.1vmrdj4gsxr690x4.rcgu.o" "/root/derp/target/debug/deps/derp-5a7445c256565e2d.1y16o1qfye96o7m0.rcgu.o" "/root/derp/target/debug/deps/derp-5a7445c256565e2d.3rngp6bm2u2q5z0y.rcgu.o" "/root/derp/target/debug/deps/derp-5a7445c256565e2d.4oc10dk278mpk1vy.rcgu.o" "/root/derp/target/debug/deps/derp-5a7445c256565e2d.4xq48u46a1pwiqn7.rcgu.o" "/root/derp/target/debug/deps/derp-5a7445c256565e2d.51s1w397y42gpez1.rcgu.o" "/root/derp/target/debug/deps/derp-5a7445c256565e2d.8xzrsc1ux72v29j.rcgu.o" "/root/derp/target/debug/deps/derp-5a7445c256565e2d.oa3rad818d8sgn4.rcgu.o" "-o" "/root/derp/target/debug/deps/derp-5a7445c256565e2d" "/root/derp/target/debug/deps/derp-5a7445c256565e2d.crate.allocator.rcgu.o" "-Wl,--gc-sections" "-pie" "-Wl,-z,relro,-z,now" "-nodefaultlibs" "-L" "/root/derp/target/debug/deps" "-L" "/root/derp/target/debug/build/derp-c3cdcf1fbd0c70b2/out" "-L" "/root/.rustup/toolchains/stable-armv7-unknown-linux-gnueabihf/lib/rustlib/armv7-unknown-linux-gnueabihf/lib" "-l" "nl-genl-3" "-l" "nl-3" "-Wl,-Bstatic" "-Wl,--whole-archive" "-l" "nl" "-Wl,--no-whole-archive" "-Wl,--start-group" "/root/.rustup/toolchains/stable-armv7-unknown-linux-gnueabihf/lib/rustlib/armv7-unknown-linux-gnueabihf/lib/libstd-774f1a5992f88ec5.rlib" "/root/.rustup/toolchains/stable-armv7-unknown-linux-gnueabihf/lib/rustlib/armv7-unknown-linux-gnueabihf/lib/libpanic_unwind-a65ab1ab71045d14.rlib" "/root/.rustup/toolchains/stable-armv7-unknown-linux-gnueabihf/lib/rustlib/armv7-unknown-linux-gnueabihf/lib/liballoc_jemalloc-5cced33d7a39db8e.rlib" "/root/.rustup/toolchains/stable-armv7-unknown-linux-gnueabihf/lib/rustlib/armv7-unknown-linux-gnueabihf/lib/libunwind-76fba694360269fc.rlib" "/root/.rustup/toolchains/stable-armv7-unknown-linux-gnueabihf/lib/rustlib/armv7-unknown-linux-gnueabihf/lib/liballoc_system-b3f660c2be971c37.rlib" "/root/.rustup/toolchains/stable-armv7-unknown-linux-gnueabihf/lib/rustlib/armv7-unknown-linux-gnueabihf/lib/liblibc-64d840c62d40ace0.rlib" "/root/.rustup/toolchains/stable-armv7-unknown-linux-gnueabihf/lib/rustlib/armv7-unknown-linux-gnueabihf/lib/liballoc-b3d8b67c899d207d.rlib" "/root/.rustup/toolchains/stable-armv7-unknown-linux-gnueabihf/lib/rustlib/armv7-unknown-linux-gnueabihf/lib/libcore-d9124265921c5963.rlib" "-Wl,--end-group" "/root/.rustup/toolchains/stable-armv7-unknown-linux-gnueabihf/lib/rustlib/armv7-unknown-linux-gnueabihf/lib/libcompiler_builtins-1aad7d9a81def783.rlib" "-Wl,-Bdynamic" "-l" "dl" "-l" "rt" "-l" "pthread" "-l" "pthread" "-l" "gcc_s" "-l" "c" "-l" "m" "-l" "rt" "-l" "pthread" "-l" "util" "-l" "util"
    = note: /root/derp/target/debug/build/derp-c3cdcf1fbd0c70b2/out/libnl.a(nl.o): In function `nl_test':
            /root/derp/src/nl.c:6: undefined reference to `nl_socket_alloc'
            /root/derp/src/nl.c:7: undefined reference to `nl_socket_free'
            collect2: error: ld returned 1 exit status
  </code></pre>