Как произвести .dll в одном ящике и проверить / связать из другого ящика? - PullRequest
0 голосов
/ 28 июня 2019

Фон

У меня проблемы с созданием 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...