构建Rust二进制文件(可执行文件或dylib)时,Cargo.toml
中配置的版本信息对构建的二进制文件没有影响,这意味着配置的版本不会存储在二进制文件中。
在Linux中,当我使用readelf -V
作为.so文件时,您可以看到支持的界面(SO名称)存储在版本定义部分' .gnu.version_d&#39下; 的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
Rust或Cargo生成的dylib或可执行文件的readelf -V
输出没有此类版本信息。 Cargo.toml
中的版本配置仅由crates.io使用。
此外,Windows DLL支持存储版本信息,而不是像Linux那样的SONAME接口版本名称。交叉编译的Windows DLL也没有版本信息。也许这是另一个问题,但我想我首先提出这一点。
答案 0 :(得分:2)
虽然我认为没有直接的方法可以使用ELF工具进行版本控制(但它们不是跨平台的),但可以使用Cargo的版本信息:
const VERSION: &'static str = env!("CARGO_PKG_VERSION");
VERSION
现在将等于运行cargo build
时清单中指定的版本。或者,如果您想在没有货物的情况下构建程序,则可以使用env_opt!()
const VERSION: Option<&'static str> = env_opt!("CARGO_PKG_VERSION");
答案 1 :(得分:1)
使用 winres(https://github.com/mxre/winres) 可以将 CARGO_PKG_VERSION 设置为 dll 文件版本,也许对其他人有帮助