簡體   English   中英

有沒有辦法導出 C static 庫中的函數?

[英]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 鏈接到動態:什么

代碼:

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;
}

Rust:

// 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM