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 ou Box<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 a Vec<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