我正在 Rust 中測驗一些 C 代碼,但 Rust 只鏈接到 Windows 上的 C 靜態庫。
問題是匯出的 C 函式只匯出到動態庫,而不匯出到靜態庫,因為我不能在 rust 中使用 dll,我無法真正鏈接到沒有匯出符號的庫(如果我嘗試to,rust 抱怨未解決的參考)。
我嘗試過的一些事情:
正常鏈接:這些曾經用于編譯,但我丟失了它,因為所有其他正常鏈接都出錯了。
與動態庫鏈接的靜態庫:當然,但它不起作用,匯出的符號也沒有出現在 中
dumpbin /exports,或者靜態庫依賴于動態庫。靜態鏈接到物件鏈接到動態:什么
代碼:
C:
// Note this is compiled with CMake to generate both a DyLib and a Static Lib.
#define EXPORT __declspec (dllexport)
EXPORT int my_func (void) {
return 3;
}
銹:
// build.rs:
fn main () {
println!("cargo:rustc-link-search=native=path/to/my/lib");
}
// lib.rs:
#[cfg (test)]
mod tests;
// No *-sys crate for simplicity
pub mod sys {
#[link (name = "my_lib")] // since Windows msvc linking is based on static libs, no matter what it is going to search for a static lib anyway...
extern {
pub fn my_func () -> i32; // libc::c_int is an alias to i32 on my machine
}
}
// tests.rs:
use crate::sys;
#[test]
fn my_func_works () {
assert_eq!(3, unsafe { sys::my_func () });
}
uj5u.com熱心網友回復:
在您的構建腳本中,您告訴貨物在哪里查找您的庫,但您從未告訴它實際使用該庫。您需要將此添加到您的build.rs:
println!("cargo:rustc-link-lib=native=my_lib.lib");
請注意,貨物檔案有這樣的說法rustc-link-search(強調我的):
該
rustc-link-search指令告訴 Cargo 將-L標志傳遞給編譯器以將目錄添加到庫搜索路徑。
和關于rustc-link-lib:
該
rustc-link-lib指令告訴 Cargo使用編譯器的標志鏈接給定的庫。-l
uj5u.com熱心網友回復:
這超出了這個答案的范圍,但這就是為什么屬性和 declspecs 是使軟體作業如此令人厭惡的原因。
如果你有圖書館;該庫有一些names具有全域范圍。例如,您可以有一個程式要求ShaveMyBall在比賽前進行足球訓練。在庫中,ShaveMyBall可能只是存在,但您可能對與外部鏈接有一些要求,因此ShaveMyBall可能需要以MyHairyBits_.
這種相反的要求可以通過符號操作實用程式輕松解決,而不是編程語言之間的怪誕基礎設施。一些簡單的目標檔案操作可以ShaveMyBall變成MyHairyBits_ShaveMyBall.
但是,如果你堅持使用奇怪的、定義不明確的,甚至更糟糕的是,部分由標準委員會定義,你最終會得到一些有時可能會起作用的東西,除了讓你為微軟收購做準備之外,這通常是死亡為任何公司喪鐘。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/369519.html
