La bibliothèque rust peut-elle être utilisée à partir d'autres langages d'une manière que les bibliothèques c font?
Écrire une telle bibliothèque devrai-je sacrifier std? Comment, par exemple, vais-je écrire des liaisons python dans la bibliothèque rust, si possible?
26
demandé sur
Moonwalker
2014-05-21 14:52:39
1 réponses
Tout d'abord, indiquez à Rust que vous voulez créer une fonction visible pour C:
#[no_mangle]
pub extern "C" fn some_func() { ... }
Cela indique à Rust d'éviter de modifier le symbole de sortie et d'utiliser le C ABI.
Ensuite, vous devrez utiliser des types compatibles C lors du franchissement de la limite. Voici quelques conseils qui ont fonctionné pour moi:
- Si vous prévoyez de passer une structure Rust à C en tant que données opaques, qu'elle transmettra à d'autres fonctions, renvoyez-la en tant que
Box<T>
, et prenez-la en tant que&T
ouBox<T>
. Essentiellement, cela signifie que vous abandonnez la propriété de la structure dans Rust et que vous donnez la propriété au code C. Le code C doit s'assurer que s'il renvoie le pointeur dans une fonction qui prend une boîte, il ne l'utilise plus . - Si vous prévoyez de passer une structure Rust à C en tant que structure C, Rust représente commodément ses structures d'une manière compatible C. Cependant, vous voudrez restreindre les types de valeurs que vous mettez dans ces structures aux types qui ont également compatible c représentations. Les types numériques et les booléens sont sûrs, bien sûr.
- Vous pouvez voir la représentation Rust de types plus complexes (comme vecs et strings) dans les documents sous core:: raw . Un
&str
et&[T]
, sont représentés comme raw::Tranche de en aVec<T>
est représenté comme un raw::Vec. - Vous pouvez également convertir des types en libc::types
- enfin, vous devrez peut-être travailler directement avec des pointeurs. Découvrez std:: mem pour les API utiles.
39
répondu
Yehuda Katz
2014-10-11 17:38:56