6

I am trying to use rust-bindgen to be able to call glfw and OpenGL functions. bindgen generates the bindings correctly, however, when I actually build my project, it gives me undefined symbols errors (I am running macOS 10.15.3 btw).

This would seem to imply that I'm not telling rustc to link the glfw dylib. However, when I write my own c program that internally calls glfw, and link that using the cc crate, there is no problem, and everything links, despite the lines linking the libraries being identical.

Code for project using bindgen

file structure:

.
├── Cargo.lock
├── Cargo.toml
├── build.rs
├── src
│   ├── lib.rs
│   ├── main.rs
│   └── wrapper.h
└── target
    └── debug
        └── build
            └── bindgen-opengl-10578485537ed6e1
                └── out
                    └── bindings.rs

wrapper.h:

#include <OpenGL/gl3.h>
#include <GLFW/glfw3.h>

My build.rs file:

extern crate bindgen;

use std::env;
use std::path::PathBuf;

fn main() {
    println!("cargo:rerun-if-changed=wrapper.h");

    println!("cargo:rustc-link-lib=framework=OpenGL");
    println!("cargo:rustc-link-lib=glfw");

    let bindings = bindgen::Builder::default()
    .header("src/wrapper.h")
    .parse_callbacks(Box::new(bindgen::CargoCallbacks))
    .generate()
    .expect("Unable to generate bindings");

    // Write the bindings to the $OUT_DIR/bindings.rs file.
    let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
    bindings
        .write_to_file(out_path.join("bindings.rs"))
        .expect("Couldn't write bindings!");
}

minimal main.rs for refrence:

pub mod lib;
use lib::*;

use std::ffi::CString;

fn main() {
unsafe {
    if glfwInit() == 0 {
        panic!("could not initialize glfw contex");
    }
};
}

Error when running cargo build

cargo build --verbose
...// list of all the dependencies in the form "Fresh <library> <version number>
   Compiling bindgen-opengl v0.1.0 (/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl)
     Running `rustc --crate-name build_script_build --edition=2018 build.rs --error-format=json --json=diagnostic-rendered-ansi --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C debuginfo=2 -C metadata=18154759f42b5c2c -C extra-filename=-18154759f42b5c2c --out-dir /Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/build/bindgen-opengl-18154759f42b5c2c -C incremental=/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/incremental -L dependency=/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps --extern bindgen=/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps/libbindgen-edca1220b7ddbe24.rlib --extern cc=/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps/libcc-d3f82cb638691b8a.rlib`
     Running `/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/build/bindgen-opengl-18154759f42b5c2c/build-script-build`
     Running `rustc --crate-name bindgen_opengl --edition=2018 src/lib.rs --error-format=json --json=diagnostic-rendered-ansi --crate-type lib --emit=dep-info,metadata,link -C embed-bitcode=no -C debuginfo=2 -C metadata=ba3f471507b4aa4b -C extra-filename=-ba3f471507b4aa4b --out-dir /Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps -C incremental=/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/incremental -L dependency=/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps --extern libc=/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps/liblibc-a4c00396c2f02399.rmeta -l framework=OpenGL -l glfw`
     Running `rustc --crate-name bindgen_opengl --edition=2018 src/main.rs --error-format=json --json=diagnostic-rendered-ansi --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C debuginfo=2 -C metadata=764361f46c5eb928 --out-dir /Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps -C incremental=/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/incremental -L dependency=/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps --extern bindgen_opengl=/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps/libbindgen_opengl-ba3f471507b4aa4b.rlib --extern libc=/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps/liblibc-a4c00396c2f02399.rlib`


error: linking with `cc` failed: exit code: 1
  |
  = note: "cc" "-m64" "-arch" "x86_64" "-L" "/Users/davidsullivan/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib" "/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps/bindgen_opengl.1fbhuuogncn8t8qg.rcgu.o" "/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps/bindgen_opengl.1nl6is5h7q6q51r1.rcgu.o" "/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps/bindgen_opengl.1ptwjmq2kz7g05re.rcgu.o" "/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps/bindgen_opengl.1qpip7dnljuttghi.rcgu.o" "/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps/bindgen_opengl.1vz4af3zov4bln51.rcgu.o" "/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps/bindgen_opengl.1ynju6elekiie4cm.rcgu.o" "/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps/bindgen_opengl.1zaomvkyv028yean.rcgu.o" "/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps/bindgen_opengl.2317r86f1qqu8ckd.rcgu.o" "/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps/bindgen_opengl.2f7c4lrnvye0y66z.rcgu.o" "/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps/bindgen_opengl.2icl32mr87tgt5l8.rcgu.o" "/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps/bindgen_opengl.2kkpdw93n8f8rop.rcgu.o" "/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps/bindgen_opengl.2lxwl70vxkfyr0j8.rcgu.o" "/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps/bindgen_opengl.2t5rogbt4ow6j3fx.rcgu.o" "/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps/bindgen_opengl.2ufo714pczmydzb0.rcgu.o" "/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps/bindgen_opengl.2uohpya5jq2muhx5.rcgu.o" "/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps/bindgen_opengl.3lal3ow7wt5gop07.rcgu.o" "/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps/bindgen_opengl.4423ksjj0jj90353.rcgu.o" "/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps/bindgen_opengl.44xlaktw56j0ahsr.rcgu.o" "/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps/bindgen_opengl.5cgcb98hve1cydn7.rcgu.o" "/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps/bindgen_opengl.7m2brxtfxiczbuf.rcgu.o" "/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps/bindgen_opengl.8epc8p33gdtfw2y.rcgu.o" "/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps/bindgen_opengl.j5rh0d55dclp6ik.rcgu.o" "/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps/bindgen_opengl.kejq8g7x9o5yu61.rcgu.o" "/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps/bindgen_opengl.yn9zdqf84rdwyip.rcgu.o" "-o" "/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps/bindgen_opengl" "/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps/bindgen_opengl.59wjtsfq29brelu1.rcgu.o" "-Wl,-dead_strip" "-nodefaultlibs" "-L" "/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps" "-L" "/Users/davidsullivan/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib" "/Users/davidsullivan/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib/libstd-fc037b734eabfbe3.rlib" "/Users/davidsullivan/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib/libpanic_unwind-ac7b281da464dcea.rlib" "/Users/davidsullivan/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib/libobject-3a37c1dd954d6080.rlib" "/Users/davidsullivan/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib/libaddr2line-1aea2a7fa030c0f9.rlib" "/Users/davidsullivan/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib/libgimli-ad4c3235139cb426.rlib" "/Users/davidsullivan/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib/librustc_demangle-c747bbf2dddfb9a7.rlib" "/Users/davidsullivan/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib/libhashbrown-9456c887af42b75c.rlib" "/Users/davidsullivan/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib/librustc_std_workspace_alloc-0c8c4f965200a4aa.rlib" "/Users/davidsullivan/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib/libunwind-79ff3dfdd51a3146.rlib" "/Users/davidsullivan/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib/libcfg_if-b7b2fd1e40d1abb6.rlib" "/Users/davidsullivan/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib/liblibc-6f21370607fd8444.rlib" "/Users/davidsullivan/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib/liballoc-9fe3dce1c4c52caa.rlib" "/Users/davidsullivan/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib/librustc_std_workspace_core-7cd2c32b1bc83b9d.rlib" "/Users/davidsullivan/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib/libcore-bda21c4b5d5eb3c7.rlib" "/Users/davidsullivan/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib/libcompiler_builtins-43231a30772c7935.rlib" "-lSystem" "-lresolv" "-lc" "-lm"
  = note: Undefined symbols for architecture x86_64:
            "_glfwInit", referenced from:
                bindgen_opengl::main::h902c6c5cf73b594c in bindgen_opengl.1ptwjmq2kz7g05re.rcgu.o
          ld: symbol(s) not found for architecture x86_64
          clang: error: linker command failed with exit code 1 (use -v to see invocation)
          

error: aborting due to previous error; 2 warnings emitted

error: could not compile `bindgen-opengl`.

Caused by:
  process didn't exit successfully: `rustc --crate-name bindgen_opengl --edition=2018 src/main.rs --error-format=json --json=diagnostic-rendered-ansi --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C debuginfo=2 -C metadata=764361f46c5eb928 --out-dir /Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps -C incremental=/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/incremental -L dependency=/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps --extern bindgen_opengl=/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps/libbindgen_opengl-ba3f471507b4aa4b.rlib --extern libc=/Users/davidsullivan/Desktop/Programing/Rust/ffi-experiments/bindgen-opengl/target/debug/deps/liblibc-a4c00396c2f02399.rlib` (exit code: 1)

Code for using CC

minimal header.c:

#include <OpenGL/gl3.h>
#define GLFW_INCLUDE_NONE
#include <GLFW/glfw3.h>

int make_window() {

    /* Initialize the library */
    if (!glfwInit())
        return -1;
    //all the other window code that I've omitted for brevity
}

build.rs file:

extern crate cc;

fn main() {
    println!("cargo:rerun-if-changed=src/header.c");
    println!("cargo:rustc-link-lib=framework=OpenGL");
    println!("cargo:rustc-link-lib=glfw");


    cc::Build::new()
        .file("src/header.c")
        .opt_level(3)
        .compile("foo");
}

main.rs:

extern {
    fn make_window();
}

fn main() {
    unsafe{
        return make_window();
    }
}

and cargo build runs fine (so does cargo run).

David Sullivan
  • 462
  • 7
  • 16
  • I also tried `println!("cargo:rustc-link-lib=dylib=glfw");` but didn't change anything. Also when I do `cargo build --verbose` it appears to be passing `-l glfw` to rustc, but it's not clear to me if that's in the wrong step – David Sullivan Nov 12 '20 at 15:25
  • I edited the post to show the full output of `cargo run --verbose` – David Sullivan Nov 14 '20 at 20:41
  • 1
    This isn't answering your question, but there is an idiomatic glfw wrapper in `glfw-rs`. – Ivan C Nov 15 '20 at 01:29
  • Thank you for that @IvanC . This isn't the only c library I want to use so I still want to figure this out, but if its just for glfw that would be a great alternative. – David Sullivan Nov 15 '20 at 23:58

0 Answers0