带有rust-bindgen的未定义符号,但可以使用cc

问题描述

我正在尝试使用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

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的代码

最小标头。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也是如此)。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...