2015-01-21 57 views
6

因此,我正在将Rust FFI写入一个C++库,该C++库具有带C风格函数头的extern“C”块。而我的低级FFI则是建立起来的。链接到具有extern“C”函数的C++库

然而,当我用我的FFI在另一个项目中,它不正确链接,我得到了一个未定义参考运算符new(),删除()等

我的问题是:

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

  2. 使用FFI库的应用程序是否应该以某种方式处理链接问题,如果是这样,怎么办?

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

  4. 把自己的解决方案在这里

回答

5

你需要动态链接到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

+0

这对我来说就像上面的选项3一样。我已经得到它在没有gcc箱子的情况下工作,但需要将'-L native = $ outdir -l static = $ libname'添加到println!()中的rustc-flags中, – 2015-01-22 06:15:14