2016-11-05 8 views
3

RustとCのソースを静的にリンクする最小限のMakefile、またはcargo/rustc + ccの呼び出しは、互いに依存しますか? example in the Rust docsに似ている(alexcrichton/rust-ffi-examplesから適応)このような何か、:FFIを使用して相互に依存するRustとCのソースを静的にリンクするにはどうすればよいですか?

main.cの

struct contrived { double x; double y; } 

double GLOBAL_CONSTANT = 100; 

extern double consume_input(struct contrived input); 

int main() { 
    double output = consume_input({.x = 1, .y = 2}); 
    printf("Got %f.", output); 
    return 0; 
} 

lib.rs

#![crate_type = "staticlib"] 

#[repr(C)] 
#[derive(Clone, Copy)] 
struct Contrived { 
    x: f64, 
    y: f64, 
} 

extern { 
    #[link(name = "main", kind = "static")] 
    static GLOBAL_CONSTANT: f64; 
} 


#[no_mangle] 
pub extern fn consume_input(input: Contrived) -> f64 { 
    input.x - input.y + GLOBAL_CONSTANT 
} 

lib.rsのみ構造体に依存している場合、それは実際にC libに依存しないのですか?

+0

あなたの質問はあまり明確ではありません。あなたは*何を試しましたか?実際の例で他の言語(Cを含む)からRustコードを呼び出すために専用の[サイト全体](http://jakegoulding.com/rust-ffi-omnibus/)があります。あなたの質問にCライブラリ*がないので、 "C lib"のようなものは混乱を招いています。おそらく "main"と呼ばれるファイルは実行ファイルにコンパイルされます(おそらく最初にオブジェクトを通して)。 – Shepmaster

答えて

0

これは'c-to-rust' exampleと変わりません。

これは私がコンパイルとリンクの段階の違いを理解していないことでした。 GLOBAL_CONSTANTへのRustファイルの依存関係はリンク時まで解決されないため、librust.aを作成してから、後で実行可能ファイルにリンクすることに問題はありません。

関連する問題