[Rust] FFI: Go에서 Rust 코드 호출하기
파이썬과 Rust는 pyo3라는 걸출한 어댑터 라이브러리가 있어서 상호운용이 편리한데, Go는 그런게 딱히 없다.
Go는 FFI로 제공하는게 cgo 정도 뿐이라서 상호연결을 하고 싶다면 Rust 코드를 적절한 정적 라이브러리로 빌드한 다음에 그걸 cgo로 꽂아야 한다.
한번 해보자.
아래는 Rust로 FFI용 함수들을 구현한 코드다.
#[no_mangle]
pub extern "C" fn add(lhs: i32, rhs: i32) -> i32 {
lhs + rhs
}
#[no_mangle]
pub extern "C" fn sub(lhs: i32, rhs: i32) -> i32 {
lhs - rhs
}
#[no_mangle]
pub extern "C" fn fibonacci(n: i64) -> i64 {
if n <= 1 {
return n;
}
fibonacci(n - 1) + fibonacci(n - 2)
}
no_mangle로 네임 맹글링이 되지 않도록 했다. 타입도 C에서 호환 가능한 타입으로 맞춰줘야 한다.
그래야 C ABI를 준수할 수 있기 때문이다.
toml에 lib 설정을 약간 해주고

빌드한다.
그럼 정적 라이브러리(.a)가 방출될 것이다.
저걸 갖다쓰면 된다.
go 코드와 함께 뭉쳐두고

cgo를 통해 링킹한다.
함수 프로토타입같은걸 매번 박아야 한다.
거슬리긴 하는데, 이게 최선일 것 같다.
그리고 실행하면 된다.

참조
https://blog.naver.com/sssang97/221729300138
https://blog.naver.com/sssang97/222901300093
https://words.filippo.io/rustgo/