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
).