crate-type = ["staticlib"] a Cargo.toml.
A continuación, debes vincular la biblioteca con CMake mediante la biblioteca Corrosion. El primer paso es añadir la carpeta de la biblioteca al CMakeLists.txt dentro de la carpeta /rust. Después, debes añadir el archivo CMakeLists.txt al directorio de la biblioteca. En él, debes llamar a la función de importación de Corrosion. Estas líneas se utilizaron para importar BLAKE3:
_ch_rust_blake3 proviene de Cargo.toml, donde se usa como nombre del proyecto (name = "_ch_rust_blake3").
Como los tipos de datos de Rust no son compatibles con los de C/C++, usaremos nuestro proyecto de biblioteca vacío para crear métodos shim que permitan convertir los datos recibidos desde C/C++, llamar a los métodos de la biblioteca y realizar la conversión inversa de los datos de salida. Por ejemplo, este método se escribió para BLAKE3:
fill(), por lo que la conversión no fue necesaria. La recomendación principal aquí es crear menos métodos, para que tenga que hacer menos conversiones en cada llamada a un método y no genere demasiada sobrecarga.
Cabe señalar que el atributo #[no_mangle] y extern "C" son obligatorios para todos esos métodos. Sin ellos, no será posible realizar una compilación compatible con C/C++ correctamente. Además, son necesarios para el siguiente paso de la integración.
Después de escribir el código para los métodos shim, debemos preparar el archivo de cabecera de la biblioteca. Esto puede hacerse manualmente, o puede usar la biblioteca cbindgen para generarlo automáticamente. En caso de usar cbindgen, tendrá que escribir un script de compilación build.rs e incluir cbindgen como build-dependency.
Un ejemplo de un script de compilación que puede generar automáticamente un archivo de cabecera:
extern "C" para cada atributo compatible con C. De lo contrario, la biblioteca puede compilarse de forma incorrecta y cbindgen no podrá autogenerar el archivo de cabecera.
Después de todos estos pasos, puedes probar tu biblioteca en un proyecto pequeño para detectar cualquier problema de compatibilidad o de generación de cabeceras. Si surge algún problema durante la generación de cabeceras, puedes intentar configurarla con el archivo cbindgen.toml (puedes encontrar una plantilla aquí: https://github.com/eqrion/cbindgen/blob/master/template.toml).
Cabe destacar el problema que surgió al integrar BLAKE3:
MemorySanitizer puede provocar falsos positivos, ya que no puede determinar si algunas variables de Rust están inicializadas o no. Se resolvió escribiendo un método con una definición más explícita para algunas variables, aunque esta implementación del método es más lenta y se usa solo para corregir las compilaciones de MemorySanitizer.