[Rust] 다른 언어에서 Rust 코드 호출

FFI를 사용하면 러스트 코드를 다른 언어에서 사용할 수 있도록, 라이브러리 형태로 배포할 수 있다.

일단 유의할 점은, Windows에선 사용이 굉장히 불편하단 것이다. 컴파일하고 빌드하는 건 잘 되는데, 링크해서 돌리는게 잘 안된다. 뭔 요구하는 라이브러리가 그리 많은지

여튼 그래서 난 Ubuntu를 사용했다.



정적 라이브러리

정적 라이브러리부터 만들어보겠다.
러스트 프로젝트를 라이브러리 형태로 생성하고,

Cargo.toml 설정파일에 아래와 같이 써준다.

name이 사출될 라이브러리 파일의 이름이고,
staticlib는 정적 라이브러리로 빌드한다는 뜻이다.
동적 라이브러리는 나중에 다루겠다.

이제 lib.rs에다가 사출될 함수들을 구현해보자.
C에서 사용될 함수엔 #[no_mangle] 속성을 달아 네임 맹글링을 막고,
extern "C"를 달아준다.

다 됐으면 빌드한다.

그럼 저 위치에

라이브러리 파일이 빌드되어있을 것이다.

이제 저걸 C에서 써보자.

gcc로 두개를 묶어서 컴파일하면

에러를 미친듯이 뿜는다.

뒤에다 저걸 더 붙여주자.

그럼 뭐, 잘 돈다.



동적 라이브러리

이번엔 동적 라이브러리를 사용해보겠다.
먼저 cargo.toml 설정파일을 수정한다.

crate-type에 cdylib를 속성값으로 준다. 저게 c 인터페이스로 동적 라이브러리를 뱉겠다는 뜻이다.
이거 말고도 dylib라는게 있는데, 이건 러스트 자체규격이라 호환이 잘 안된다.

코드는 바꿀게 없다. 그대로 간다.

그럼 뭐... 공유 파일인 so가 잘 들어있을 것이다.

코드는 그대로 두고 돌려보겠다.
컴파일을 하고,
프로그램이 동적 라이브러리를 사용할 수 있도록 경로를 LD_LIBRARY_PATH에 추가한다.

그러고 실행하면


똑같이 잘 돈다.

그렇다.


참조
http://siciarz.net/24-days-of-rust-calling-rust-from-other-languages/
https://doc.rust-lang.org/1.5.0/book/rust-inside-other-languages.html