2015-07-01 114 views
4

是否可以創建一個用rustc編譯的靜態庫並將其鏈接到使用MSVC編譯的可執行文件?Rust和C與Visual Studio兼容

+1

我想這是理論上的可能;您必須匹配修飾的函數名稱,調用約定,參數和返回類型。爲什麼不創建一個dll並在C中構建一個thunk層?可能最終會變得更加穩定。 – Bathsheba

+0

由於性能的原因,我寧願遠離DLL ...... – Jouan

+0

根據我的經驗,他們很好,你曾經調用函數一次,並且可以緩存函數指針。 – Bathsheba

回答

1

如果你只想使用rustc產生一個靜態庫,你會在你的箱子的lib.rs文件中指定的一些屬性,以及標記爲使導出的函數做到這一點:

#![crate_type = "static_lib"] 
#![crate_name = "mylib"] 

use libc::c_int; 

#[no_mangle] 
pub extern fn my_exported_func(num: c_int) -> c_int { 
    num + 1 
} 

然後,只需調用rustc lib.rs。這適用於rustc支持的所有平臺。

在C/C++頭,添加:

#pragma once 

// only use extern block if the header is put inside a C++ CU 
extern "C" { 
    int my_exported_func(int num); 
} 

和鏈接.lib.a根據需要的輸出。

對於貨物,您可以在您的Cargo.toml中指定貨箱類型和名稱。

來源:

+1

要小心,Rust的'i32'不一定等於C的'int'。 –

+1

改爲使用'libc :: c_int'。 –

+0

謝謝,更正。 – Eidolon

相關問題