4

我正在尝试使用 rust-bindgen 来调用 glfw 和 OpenGL 函数。bindgen 正确生成绑定,但是,当我实际构建我的项目时,它给了我未定义的符号错误(我正在运行 macOS 10.15.3 btw)。

这似乎意味着我没有告诉 rustc 链接 glfw dylib。但是,当我编写自己的内部调用 glfw 的 c 程序并使用 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

包装器.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)。

4

0 回答 0