๋น๋ ๊ท์น
Chromium ๋น๋์์ ๋ค์์ ํฌํจํ๋ //ui/base/BUILD.gn
์ ์ Rust ํ๊ฒ์ ์ถ๊ฐํฉ๋๋ค.
#![allow(unused)] fn main() { #[no_mangle] pub extern "C" fn hello_from_rust() { println!("Hello from 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๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด์ VSCode์์ ์ ์๋ํ๋๋ก Rust๋ฅผ ์ค์ ํฉ๋๋ค. ์ดํ ์ฐ์ต์์ ์ ์ฉํฉ๋๋ค. ์ฑ๊ณตํ๋ฉด println!
์์ โ์ ์๋ก ์ด๋โ์ ๋ง์ฐ์ค ์ค๋ฅธ์ชฝ ๋ฒํผ์ผ๋ก ํด๋ฆญํ ์ ์์ต๋๋ค.
๋์์ ๋ฐ์ ์ ์๋ ๊ณณ
rust_static_library
gn ํ ํ๋ฆฟ์์ ์ฌ์ฉ ๊ฐ๋ฅํ ์ต์ #[no_mangle]
์ ๊ดํ ์ ๋ณดextern "C"
์ ๊ดํ ์ ๋ณด- gn์
--export-rust-project
์ ํ ์ ๋ณด - VSCode์์ rust-analyzer๋ฅผ ์ค์นํ๋ ๋ฐฉ๋ฒ
์ด ์๋ ์ต์ ๊ณตํต๋ถ๋ชจ ์ํธ ์ด์ฉ์ฑ ์ธ์ด์ธ C๋ก ๊ท๊ฒฐ๋๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ด์ง ์์ต๋๋ค. C++์ Rust ๋ชจ๋ ๊ธฐ๋ณธ์ ์ผ๋ก C ABI ํจ์๋ฅผ ์ ์ธํ๊ณ ํธ์ถํ ์ ์์ต๋๋ค. ์ด ๊ณผ์ ์ ํ๋ฐ๋ถ์์ C++๋ฅผ Rust์ ์ง์ ์ฐ๊ฒฐํฉ๋๋ค.
์ฌ๊ธฐ์ allow_unsafe = true
๊ฐ ํ์ํ ์ด์ ๋ #[no_mangle]
์ด Rust๊ฐ ์ด๋ฆ์ด ๊ฐ์ ํจ์ ๋ ๊ฐ๋ฅผ ์์ฑํ ์ ์๋๋ก ํ ์ ์๊ณ Rust๋ ๋ ์ด์ ์ฌ๋ฐ๋ฅธ ํจ์๊ฐ ํธ์ถ๋๋ค๊ณ ๋ณด์ฅํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
์์ํ Rust ์คํ ํ์ผ์ด ํ์ํ๋ฉด rust_executable
gn ํ
ํ๋ฆฟ์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.