Usando CXX no Chromium
No Chromium, definimos um #[cxx::bridge] mod
independente para cada nĂł folha onde queremos usar o Rust. Normalmente, vocĂȘ teria um para cada rust_static_library
. Basta adicionar
cxx_bindings = [ "my_rust_file.rs" ]
# list of files containing #[cxx::bridge], not all source files
allow_unsafe = true
para o seu alvo rust_static_library
existente ao lado de crate_root
e sources
.
Cabeçalhos C++ serĂŁo gerados em um local sensato, entĂŁo vocĂȘ pode apenas
#include "ui/base/my_rust_file.rs.h"
VocĂȘ encontrarĂĄ algumas funçÔes utilitĂĄrias em //base
para converter de/ para tipos C++ do Chromium para tipos Rust CXX â por exemplo SpanToRustSlice
.
Os alunos podem perguntar â por que ainda precisamos de allow_unsafe = true
?
A resposta mais geral Ă© que nenhum cĂłdigo C/C++ Ă© âseguroâ pelos padrĂ”es normais do Rust. Chamar C/C++ a partir do Rust pode fazer coisas arbitrĂĄrias na memĂłria e comprometer a segurança dos prĂłprios layouts de dados do Rust. A presença de muitas palavras-chave unsafe
na interoperabilidade C/C++ pode prejudicar a relação sinal-ruĂdo de tal palavra-chave e Ă© controversa, mas estritamente, trazer qualquer cĂłdigo externo para um binĂĄrio Rust pode causar um comportamento inesperado do ponto de vista do Rust.
A resposta mais especĂfica estĂĄ no diagrama no topo desta pĂĄgina â nos bastidores, o CXX gera funçÔes Rust unsafe
e extern "C"
exatamente como fizemos manualmente na seção anterior.