2015-01-21 53 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