Неопределенные символы с помощью rust-bindgen, но могут компилироваться с помощью cc
Я пытаюсь использовать rust-bindgen, чтобы иметь возможность вызывать функции glfw и OpenGL. bindgen правильно генерирует привязки, однако, когда я действительно создаю свой проект, он дает мне ошибки неопределенных символов (я запускаю macOS 10.15.3 btw).
Это могло бы означать, что я не говорю rustc связывать dylib glfw. Однако, когда я пишу свою собственную программу c, которая вызывает внутри себя glfw, и связываю ее с помощью cc crate, проблем нет, и все связывается, несмотря на то, что строки, связывающие библиотеки, идентичны.
Код для проекта с использованием bindgen
файловая структура:
.
├── 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>
Мой файл build.rs:
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!");
}
минимальные main.rs для справки:
pub mod lib;
use lib::*;
use std::ffi::CString;
fn main() {
unsafe {
if glfwInit() == 0 {
panic!("could not initialize glfw contex");
}
};
}
Ошибка при запуске
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)
Код для использования CC
минимальный 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 файл:
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();
}
}
и
cargo build
работает нормально (как и
cargo run
).