Фон
У меня проблемы с созданием DLL "туда и обратно" в Windows.В ящике a
я хочу создать DLL (а затем .so
, ...), которую мы хотим отправить клиентам.Это выглядит примерно так:
От a/src/lib.rs
:
#[no_mangle]
pub unsafe extern "C" fn f(x: i32) -> i32 {
x * x
}
От a/Cargo.toml
:
[lib]
name = "a_library"
path = "src/lib.rs"
crate-type = [ "cdylib" ]
Чтобы проверить эту DLL, у меня есть ящик b
где я хочу загрузить его и вызвать его функции.Это выглядит так:
С b/src/main.rs
:
#[link(name = "a_library", kind = "dylib")]
extern "C" {
fn f(x: i32) -> i32;
}
С b/Cargo.toml
:
[dependencies]
a = { path = "../a" }
С установкой crate-type
на cdylib
itпроизводит a_library.dll
и a_library.dll.lib
.
.dll
- это то, что я хочу.Он должен создавать динамическую (линкованную) библиотеку, а не статические библиотеки.Аналогично, когда я тестирую, я хочу протестировать динамическую библиотеку.
Я использую nightly-x86_64-pc-windows-msvc
/ 1.37.0-nighly
, но решение должно работать где угодно (включая MacOS / Linux позже).
Репозиторий с минимальным тестовым набором, которыйпроблема с Windows.
Проблема
Однако, когда я теперь хочу запустить / протестировать мое тестовое приложение в b
, я получаю
LINK : fatal error LNK1181: cannot open input file 'a_library.lib'.
Ну, это как-то правильно, потому что Rust фактически никогда не производил a_library.lib
из ящика a
, просто a_library.dll.lib
.
Вопрос
Какое изменение я должен сделать в ящике b
, чтобы заставить это работать?
(Я готов изменить a
, покапоскольку он продолжает создавать DLL, и пока b
все еще динамически связывается с a
при тестировании f
).