链接到具有extern" C"的C ++库。功能

时间:2015-01-21 05:34:59

标签: rust ffi

所以我将Rust FFI编写到一个C ++库中,该库有一个extern" C"阻止其中包含C风格的函数头。而我的低级FFI构建。

但是,当我在另一个项目中使用我的FFI时,它没有正确链接,我得到了对运算符new(),delete()等的未定义引用。

我的问题是:

  1. 我搞砸了,因为这是C ++而你无法将Rust链接到C ++吗?

  2. 使用FFI库的应用程序是否应该以某种方式处理链接问题?若然,怎么做?

  3. 我的libsomething.a可以以某种方式构建,以包含这些C ++组件,如果是这样,如何?我目前正在使用gcc crate。

  4. 将您自己的解决方案放在此处

2 个答案:

答案 0 :(得分:6)

您需要动态链接到libstdc++以获取C ++代码所需的符号。您可以在构建脚本中指示rustc执行此操作:

extern crate gcc;
use std::default::Default;

fn main() {
    gcc::compile_library("libhello.a", &Default::default(), &["cpp/hello.cpp"]);
    println!("cargo:rustc-flags=-l dylib=stdc++");
}

See full example on github

有关构建脚本的详细信息,请参阅the Cargo guide

答案 1 :(得分:1)

这对于我使用cmake板条箱在macOS上有效。

// build.rs
extern crate cmake;

fn main() {
    let dst = cmake::Config::new("my_c_lib")
        .no_build_target(true)
        .always_configure(true)
        .build();

    // This was the fix
    println!("cargo:rustc-flags=-l dylib=c++");

    // The cmake crate outputs the static lib in the build subdir in the cargo $OUT_DIR,
    // which is a little different than their docs show.
    println!("cargo:rustc-link-search=native={}/build", dst.display());
    println!("cargo:rustc-link-lib=static=my_c_lib");
}

请注意,我在native/下拥有C / C ++代码作为git子模块,并且该项目正在使用cmake。

This answer也有帮助。