Есть ли способ использовать 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 также будет динамически компоноваться, чего я не ожидал.

0 ответов

Другие вопросы по тегам