Как связать динамическую библиотеку Rust, используя только rustc, а не cargo? - PullRequest
0 голосов
/ 05 апреля 2019

Мой main.rs выглядит как

// #[link(name = "lib")]
extern "C" {
    fn hello();
}

fn main() {
    unsafe {
        hello();
    }
}

И lib.rs:

#[no_mangle]
pub fn hello() {
    println!("Hello, World!");
}

Я скомпилировал lib.rs, используя rustc --crate-type=cdylib lib.rs -o lib.so

Как сделатьЯ связываю lib.so с rustc main.rs командой?

1 Ответ

3 голосов
/ 05 апреля 2019

Вы должны соответствовать 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...