Есть ли способ использовать Rust-Cargo для динамического связывания НЕКОТОРЫХ ящиков с зависимостями?
У меня есть ржавый проект, он имеет следующую структуру:
├─engine
│ │ Cargo.lock
│ │ Cargo.toml
│ │
│ └─src
│ lib.rs
│
├─sandbox
│ │ build.rs
│ │ Cargo.toml
│ │
│ └─src
│ main.rs
│
└─test_static
│ Cargo.toml
│
└─src
lib.rs
Ящик представляет собой контейнер для мусора, предназначен для использования в качестве dylib и является rlib.
Вsandbox/cargo.toml
:
[package]
name = "sandbox"
version = "0.1.0"
edition = "2021"
build = "build.rs"
[dependencies]
prefer-dynamic = "0"
engine = { path = "../engine" }
test_static = { path = "../test_static" }
Я хочу собрать ящик как dylib, как rlib и собратьsandbox
, сtest_static
статически связаны иengine
динамически связаны.
Для достижения своей цели я использовал следующееrustc
команды:
rustc --crate-name engine engine\src\lib.rs --crate-type dylib -C prefer-dynamic
rustc --crate-name test_static test_static\src\lib.rs --crate-type rlib
rustc sandbox\src\main.rs --crate-type bin --extern engine='engine.dll' --extern test_static='libtest_static.rlib'
Эти команды работали просто отлично, но мне интересно, есть ли способ добиться этого с помощью Cargo... При использовании команды «cargo build» в корневом каталоге проекта я всегда получаю двоичный файл, который статически связывает 2 зависимости.
Я искал официальные документы, RFC, но ничего не нашел, кажется, что зависимости должны быть либо полностью статическими (по умолчанию), либо автодинамическими (используя RUSTFLAGS='-C Prefer-Dynamic', что приведет к созданию ржавчины все динамически, если это возможно).
Есть ли какой-либо синтаксис настроек Cargo.toml, чтобы указать, как связать ящик зависимостей? Например, встроенная libstd при использованииRUSTFLAGS='-C prefer-dynamic'
, libstd также будет динамически компоноваться, чего я не ожидал.