代码之家  ›  专栏  ›  技术社区  ›  palazzo train

有没有办法将版本信息存储在Rust编译的可执行文件或库中?

  •  13
  • palazzo train  · 技术社区  · 10 年前

    当构建Rust二进制文件(可执行文件或dylib)时 Cargo.toml 对构建的二进制文件没有影响,这意味着配置的版本不会存储在二进制文件中。

    在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

    这个 自述-V Rust或Cargo生成的dylib或可执行文件的输出没有此类版本信息。中的版本配置 货物.toml 仅由crates.io使用。

    此外 ,Windows DLL支持存储版本信息,而不是像Linux那样存储SONAME接口版本名称。交叉编译的Windows DLL也没有版本信息。也许这是另一个问题,但我想我会首先提出这一点。

    3 回复  |  直到 10 年前
        1
  •  10
  •   Vladimir Matveev    10 年前

    虽然我认为没有立即使用ELF工具进行版本控制的方法(无论如何,它们不是跨平台的),但可以使用Cargo的版本信息:

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

    VERSION 现在将等于清单中指定的版本 cargo build 正在运行。或者,您可以使用 env_opt!() 如果您想在没有Cargo的情况下构建程序:

    const VERSION: Option<&'static str> = env_opt!("CARGO_PKG_VERSION");
    
        2
  •  1
  •   allenchou13    5 年前

    使用winres( https://github.com/mxre/winres )可以将CARGO_PKG_VERSION设置为dll文件版本,可能对其他人有所帮助

        3
  •  1
  •   ndrsllwngr    4 年前

    更新接受的答案。2021,答案中提到的第二个宏( env_opt )现在可以通过 std::option_env

    const CARGO_PKG_VERSION: Option<&'static str> = option_env!("CARGO_PKG_VERSION");
    

    然后,你可以像这样使用它

    info!("Booting up... VERSION={}", CARGO_PKG_VERSION.unwrap_or("NOT_FOUND"));
    

    此外,请注意,如果您想在二进制文件中包含默认配置 std::include_str 可能会感兴趣。