Вы должны соответствовать ABI. Когда вы используете блок extern "C"
, вам нужно объявить свои функции, используя тот же ABI.
Назовите вашу динамическую библиотеку, используя соглашения платформы. Используйте .dylib
в macOS, .lib
в Windows и .so
в Linux. rustc
сделает это автоматически, если вы не предоставите опцию -o
.
После того, как вы создали свою динамическую библиотеку, вам нужно добавить ее в опции компоновщика компилятора. rustc --help
имеет список различных опций компилятора. -L
добавляет каталог к пути поиска и -l
ссылается на определенную библиотеку.
lib.rs
#[no_mangle]
pub extern "C" fn hello() {
println!("Hello, World!");
}
main.rs
extern "C" {
fn hello();
}
fn main() {
unsafe {
hello();
}
}
Скомпилировано и выполнено с:
$ rustc --crate-type=cdylib lib.rs
$ rustc main.rs -L . -l lib
$ ./main
Hello, World!
Поскольку я использую macOS, я использовал otool
, чтобы показать, что он действительно динамически связан:
$ otool -L main
main:
liblib.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.250.1)
/usr/lib/libresolv.9.dylib (compatibility version 1.0.0, current version 1.0.0)
Смотри также:
Для полноты вот "нормальное" связывание ящиков:
lib.rs
pub fn hello() {
println!("Hello, World!");
}
main.rs
fn main() {
lib::hello();
}
$ rustc --crate-type=rlib lib.rs
$ rustc main.rs --extern lib=liblib.rlib
$ ./main
Hello, World!
$ otool -L main
main:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.250.1)
/usr/lib/libresolv.9.dylib (compatibility version 1.0.0, current version 1.0.0)