Когда создается двоичный файл 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
Выходные данные readelf -V
для dylib или исполняемого файла, сгенерированного Rust или Cargo, не содержат такой информации о версии. Конфигурация версии в Cargo.toml
используется только crates.io.
Более того , библиотеки DLL Windows поддерживают хранение информации о версии, а не имени версии интерфейса SONAME, как Linux. Кросс-скомпилированная DLL Windows также не имеет информации о версии. Возможно, это другой вопрос, но я подумал, что сначала подниму его здесь.
3 ответа
Хотя я не думаю, что есть непосредственный способ использовать средства 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");
VERSION
- это просто обычная константа, поэтому заставьте вашу программу печатать ее, когда вы запускаете ее определенным образом, например, передав аргумент командной строки -v
(как это делают многие инструменты CLI): your-program -v
. Опять же, как я уже сказал, это не связано с информацией о версии, специфичной для двоичного формата (заголовки ELF, заголовки PE или что-то еще).
Использовать winres (https://github.com/mxre/winres) можно установить для CARGO_PKG_VERSION версию файла dll , может быть, поможет другим
Чтобы дать обновленную информацию о принятом ответе. В Rust 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
может представлять интерес.
Похожие вопросы
Новые вопросы
dll
Динамически подключаемая библиотека (DLL) - это модуль, содержащий функции и данные, которые могут использоваться другим модулем (приложением или DLL). Это реализация Microsoft концепции общей библиотеки в операционных системах Microsoft Windows и OS / 2.