Вправа правил побудови
У вашій збірці Chromium додайте нову ціль Rust до файлу //ui/base/BUILD.gn
, що містить:
#![allow(unused)] fn main() { // БЕЗПЕКА: Не існує іншої глобальної функції з таким іменем. #[unsafe(no_mangle)] pub extern "C" fn hello_from_rust() { println!("Привіт від Rust!") } }
Важливо: зауважте, що no_mangle
тут розглядається компілятором Rust як тип небезпеки, тому вам потрібно буде дозволити небезпечний код у вашій цілі gn
.
Додайте цю нову ціль Rust як залежність від //ui/base:base
. Оголосіть цю функцію у верхній частині файлу ui/base/resource/resource_bundle.cc
(пізніше ми побачимо, як це можна автоматизувати за допомогою інструментів генерації прив'язок):
extern "C" void hello_from_rust();
Викличте цю функцію звідкись з ui/base/resource/resource_bundle.cc
- радимо зверху ResourceBundle::MaybeMangleLocalizedString
. Зберіть і запустіть Chromium, і переконайтеся, що "Hello from Rust!" виводиться багато разів.
Якщо ви використовуєте VSCode, налаштуйте Rust для роботи у VSCode. Це стане у нагоді у наступних вправах. Якщо вам це вдалося, ви зможете скористатися командою "Go to definition" правою кнопкою миші на println!
.
Де знайти допомогу
- Опції, доступні для
rust_static_library
шаблону gn - Інформація про
#[unsafe(no_mangle)]
- Інформація про
extern "C"
- Інформація про перемикач
--export-rust-project
gn - Як встановити rust-analyzer у VSCode
Цей приклад є незвичайним, тому що він зводиться до мови взаємодії з найменшим спільним знаменником - C. І C++, і Rust можуть оголошувати та викликати функції C ABI на мові C. Пізніше у курсі ми підключимо C++ безпосередньо до Rust.
Тут потрібен allow_unsafe = true
, оскільки #[unsafe(no_mangle)]
може дозволити Rust згенерувати дві функції з однаковими іменами, і Rust більше не зможе гарантувати, що буде викликано правильну функцію.
Якщо вам потрібен чистий виконуваний файл Rust, ви також можете зробити це за допомогою шаблону gn rust_executable
.