Написав такую библиотеку, я должен пожертвовать std? Как, например, я буду писать привязки python в библиотеку ржавчины, если это возможно?
Может ли библиотека ржавчины использоваться с других языков так, как это делают библиотеки c?
Ответ 1
Сначала укажите Rust, что вы хотите создать функцию, видимую для C:
#[no_mangle]
pub extern "C" fn some_func() { ... }
Это говорит Rust, чтобы избежать искажения выходного символа и использовать C ABI.
Затем вам нужно будет использовать C-совместимые типы при пересечении границы. Вот несколько советов, которые сработали для меня:
- Если вы планируете передать структуру Rust на C как непрозрачные данные, которые будут переданы обратно в другие функции, верните ее как
Box<T>
и возьмите ее как&T
илиBox<T>
. По сути, это означает, что вы отказываетесь от владения структурой в Rust и предоставляете право собственности на код C. Код C должен гарантировать, что если он вернет указатель обратно в функцию, которая принимает поле, он больше не использует его. - Если вы планируете передать структуру Rust на C как структуру C, Rust удобно представляет свои структуры в C-совместимом режиме. Однако вы захотите ограничить типы значений, которые вы вставляете в эти структуры, в типы, которые также имеют совместимые представления C. Конечно, числовые типы и логические элементы безопасны.
- В документах под core:: raw вы можете увидеть представление Rust более сложных типов (например, vecs и strings). A
&str
и&[T]
представлены как raw:: Slice, аVec<T>
представляется как raw::. Vec - Вы также можете преобразовать типы в libc:: types
- Наконец, вам может понадобиться работать с указателями напрямую. Проверьте std:: mem на полезные API.