crate-type = ["staticlib"] ao Cargo.toml.
Em seguida, você precisa vincular a biblioteca ao CMake usando a biblioteca Corrosion. O primeiro passo é adicionar a pasta da biblioteca ao CMakeLists.txt dentro da pasta /rust. Depois disso, você deve adicionar o arquivo CMakeLists.txt ao diretório da biblioteca. Nele, é preciso chamar a função de importação do Corrosion. Estas linhas foram usadas para importar o BLAKE3:
_ch_rust_blake3 vem do Cargo.toml, onde é usado como nome do projeto (name = "_ch_rust_blake3").
Como os tipos de dados do Rust não são compatíveis com os tipos de dados de C/C++, usaremos nosso projeto de biblioteca vazio para criar métodos shim para converter os dados recebidos de C/C++, chamar métodos da biblioteca e fazer a conversão inversa dos dados de saída. Por exemplo, este método foi escrito para o BLAKE3:
#[no_mangle] e extern "C" são obrigatórios para todos esses métodos. Sem eles, não será possível realizar uma compilação correta compatível com C/C++. Além disso, eles são necessários para a próxima etapa da integração.
Depois de escrever o código para os métodos shim, precisamos preparar o arquivo de cabeçalho da biblioteca. Isso pode ser feito manualmente, ou você pode usar a biblioteca cbindgen para geração automática. Caso use o cbindgen, será necessário escrever um script de build, build.rs, e incluir o cbindgen como build-dependency.
Um exemplo de script de build que pode gerar automaticamente um arquivo de cabeçalho:
extern "C" para cada item compatível com C. Sem isso, a biblioteca pode ser compilada incorretamente, e o cbindgen não iniciará a autogeração do cabeçalho.
Depois de todas essas etapas, você pode testar sua biblioteca em um projeto pequeno para identificar eventuais problemas de compatibilidade ou de geração de cabeçalhos. Se surgir algum problema durante a geração de cabeçalhos, tente configurá-la com o arquivo cbindgen.toml (você pode encontrar um modelo aqui: https://github.com/eqrion/cbindgen/blob/master/template.toml).
Vale mencionar o problema que ocorreu ao integrar o BLAKE3:
O MemorySanitizer pode gerar relatórios de falso positivo, pois não consegue determinar se algumas variáveis em Rust estão inicializadas ou não. Isso foi resolvido escrevendo um método com uma definição mais explícita para algumas variáveis, embora essa implementação do método seja mais lenta e seja usada apenas para corrigir builds do MemorySanitizer.