2016-01-05 44 views
4

構建Rust二進制文件(可執行文件或dylib)時,在Cargo.toml中配置的版本信息對構建的二進制文件沒有影響,這意味着配置的版本不存儲在二進制文件中。有沒有辦法將版本信息存儲在Rust編譯的可執行文件或庫中?

在Linux中,當我使用readelf -V一個.so文件,你可以看到支持的接口(SO名稱)存儲在「.gnu.version_d」 ELF文件的的版本定義部分。例如,readelf -V /lib/libnss_files-2.12.so輸出:

Version definition section '.gnu.version_d' contains 2 entries: 
    Addr: 0x0000000000001540 Offset: 0x001540 Link: 5 (.dynstr) 
    000000: Rev: 1 Flags: BASE Index: 1 Cnt: 1 Name: libnss_files.so.2 
    0x001c: Rev: 1 Flags: none Index: 2 Cnt: 1 Name: GLIBC_PRIVATE 

/lib/libnss_files-2.12.so文件正在執行接口版本libnss_files.so.2

readelf -V輸出用於生鏽或貨物產生dylib或可執行沒有這樣的版本信息。 Cargo.toml中的版本配置僅由crates.io使用。

而且,Windows DLL支持存儲版本信息,而不是像Linux那樣的SONAME接口版本名稱。交叉編譯的Windows DLL也沒有版本信息。也許這是另一個問題,但我想我先在這裏提出這一點。

+0

據[交叉張貼到reddit(https://www.reddit.com/r/rust/comments/3zi8xh/no_rust_version_info_stored_in_dylib_dynamic_link /) –

+0

@Shepmaster,再次感謝您的編輯:) –

回答

2

雖然我不認爲這是使用ELF設施版本的直接的方式(他們是不是跨平臺反正),它可以使用從貨物版本信息:

const VERSION: &'static str = env!("CARGO_PKG_VERSION"); 

VERSION會現在等於運行cargo build時在清單中指定的版本。另外,您也可以使用env_opt!(),如果你想不貨物打造你的程序:

const VERSION: Option<&'static str> = env_opt!("CARGO_PKG_VERSION"); 
+0

那麼我得到最終構建的二進制文件後,如何才能讀取版本信息? –

+0

好吧,'VERSION'只是一個常量,所以當你以某種方式運行它時,讓你的程序打印它,例如,通過傳遞'-v'命令行參數(就像很多CLI工具一樣):'你的-program -v'。同樣,正如我所說的,這與特定於二進制格式(ELF頭文件,PE頭文件或其他任何文件)的版本信息無關。 –

+0

好吧,這意味着我不能在lib中運行代碼的情況下查看版本。但可以知道這個事實。你知道有沒有計劃Cargo/Rust使用操作系統本地設備進行版本控制? –

相關問題