Какое правильное местоположение для файла config.toml?

Как правильно настроить config.toml в Cargo, чтобы избавиться от зависимости Microsoft Visual C++ Runtime (vcruntime140.dll) и почему установка флага не приводит к желаемому результату?
Изображение к вопросу
  • 26 января 2024 г. 4:18
Ответы на вопрос 2
Файл `config.toml` используется инструментом сборки Rust - Cargo для определения проект-специфичных настроек. Обычно он не предназначен для настройки зависимостей от внешних библиотек в системе, таких как Microsoft Visual C++ Runtime. Однако, вы можете настроить проект так, чтобы статически линковать некоторые библиотеки, что может уменьшить зависимости от DLL.

Если же ваша цель — избежать зависимости от `vcruntime140.dll` для бинарного файла, собранного с помощью Rust, то это не имеет прямого отношения к файлу `config.toml`, столь же как и к Cargo.

Вместо этого, подобная задача обычно решается настройкой самого Rust и linker-а, который используется при компиляции проекта. В случае использования MSVC toolchain для Rust, вам может потребоваться настроить linker так, чтобы статически линковать C++ runtime. Это делается путем передачи определенных флагов linker-у через переменные среды или через файла `.cargo/config` вашего проекта.

Например, вы можете попробовать добавить флаги для статической линковки в `.cargo/config`:

```toml
[target.x86_64-pc-windows-msvc]
rustflags = [
  "-C", "target-feature=+crt-static",
]
```

Этот флаг указывает компилятору Rust (и linker-у) статически линковать Microsoft C++ Runtime.

Однако, есть несколько моментов, которые необходимо принять во внимание:

1. Некоторые крейты могут иметь свои собственные динамические зависимости, и вам нужно будет убедиться, что их также можно статически линковать.
2. В некоторых случаях лицензионные ограничения могут запрещать статическую линковку определенного программного обеспечения.
3. Возможно, потребуется обеспечить, чтобы все зависимости поддерживали статическую линковку; в противном случае, статическая линковка одних библиотек может вызвать конфликты с другими, которые линкованы динамически.

Если установка флага не приводит к желаемому результату, убедитесь, что все условия для статической линковки выполнены и другие компоненты вашего проекта не требуют динамических библиотек. Возможно, потребуется дополнительная настройка компонентов вашего проекта или исправление конфигурации build-а.
Cargo считывает все конфигурационные файлы начиная с папки проекта (там где файл Cargo.lock и папка target) и во всех его родительских папках, а так же в домашней папке cargo. 
https://doc.rust-lang.org/cargo/reference/config.h...
То есть в данном примере будут работать оба этих файла.

Я бы проверял в сторону работает ли это условие:
cfg(all(windows, target_env="msvc"))
Похожие вопросы