[英]Is there a way to export functions in C static library?
i am testing some C code in Rust, but rust only links to C static libraries on windows.
問題是導出的 C 函數只導出到動態庫,而不是 Static 一個,因為我不能在 rust 中使用 dll 沒有導出庫的鏈接(如果我可以至,rust 抱怨未解決的引用)。
我嘗試過的一些事情:
正常鏈接:這些用於編譯一次,但我丟失了它,因為所有其他正常的 go 錯誤。
Static lib 與動態庫鏈接:當然,但它不起作用,導出的符號也沒有出現在dumpbin /exports
中,或者 static 庫依賴於動態庫。
Static 鏈接到 Object 鏈接到動態:什么
// 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 () });
}
對於這個答案來說,scope 已經很遠了,但這就是為什么屬性和 declspecs 對使軟件工作如此令人厭惡的原因。
如果你有圖書館; 該庫有一些具有全局scope 的names
。 例如,您可以有一個名為ShaveMyBall
的程序來修飾足球賽前。 在庫中,可能只存在ShaveMyBall
,但您可能對與外部鏈接有一些要求,因此ShaveMyBall
可能需要以MyHairyBits_
為前綴。
這種相反的要求可以很容易地通過符號操作實用程序來解決,而不是編程語言之間的怪誕基礎設施。 一些簡單的 object 文件操作可以將ShaveMyBall
更改為MyHairyBits_ShaveMyBall
。
但是,如果你堅持使用奇怪的、定義不明確的,甚至更糟糕的是,部分由標准委員會定義,你最終會得到一些有時可能會起作用的東西,除了讓你被微軟收購之外,這通常是死亡為任何公司敲響警鍾。
在您的構建腳本中,您告訴 cargo在哪里尋找您的庫,但您從未告訴它實際使用該庫。 您需要將此添加到您的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
標志鏈接給定的庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.