Редактировать примечание
Поскольку у Rust (вер. 1.42) все еще нет стабильного ABI , рекомендуется использовать extern
(что в настоящее время эквивалентно extern "C"
(может измениться в будущем)) В противном случае может потребоваться перекомпиляция библиотек. В этой статье объясняется, как изменить соглашение о вызовах .
Цель состоит в том, чтобы иметь возможность работать с искаженными именами (что позволило бы сосуществование функций из разных модулей / пространств имен, имеющих одинаковые идентификаторы) внутри ящика, который использует библиотеку. Я заметил, что Rust (вер. 1.42) автоматически предполагает, что идентификаторы функций экспортируемых функций не искажены. На данный момент я могу успешно связать его и использовать при использовании #[no_mangle]
и #[export_name="..."]
в функциях. Я использую набор инструментов stable-x86_64-windows-pc-msvc
.
Рабочий пример
rslib / lib.rs:
#[no_mangle] /* Exports it as "func" */
pub extern fn func() { ... }
app / main.rs:
#[link(name="rslib.dll", kind="dylib")]
extern { fn func(); }
fn main() {
unsafe { func(); }
}
Компилируется и запускается без проблем.
Пример не работает
rslib / lib .rs:
pub extern fn func() { ... }
Использование того же "app / main.rs" приводит к сбою связи с: error LNK2019: unresolved external symbol __imp_func referenced in function _ZN8rust_app4main17h52189e261ef80b93E
.