본문 바로가기
Rust - 교육

[Rust 교육] FFI - 러스트와 C 언어 연동하기

by CodeCrossover 2023. 8. 14.
반응형

러스트와 C 언어를 연동하려면 FFI (Foreign Function Interface)를 사용해야 합니다. 이를 통해 두 언어 간의 함수 호출이나 데이터 전달이 가능합니다. 이 글에서는 이러한 연동 방법을 상세하게 알아보겠습니다.


1. 러스트에서 C 함수 호출하기

  • 러스트에서는 `extern` 키워드를 사용하여 C 함수를 선언하고 호출할 수 있습니다.
// C 함수를 선언합니다.
extern "C" {
    fn c_function_name(arg1: Type1, arg2: Type2) -> ReturnType;
}

// 러스트에서 C 함수를 호출합니다.
fn call_c_function() {
    unsafe {
        c_function_name(value1, value2);
    }
}
  • `unsafe` 블록은 러스트의 안전성 보장을 벗어나는 코드를 실행할 때 필요합니다.

 

2. C에서 러스트 함수 호출하기

  • C에서 러스트 함수를 호출하려면 함수에 `no_mangle` 속성을 추가하고 `extern` 키워드를 사용해야 합니다.
// C에서 호출 가능한 러스트 함수를 정의합니다.
#[no_mangle]
pub extern "C" fn rust_function_name(arg1: Type1, arg2: Type2) -> ReturnType {
    // 함수 본문
    ...
}
  • `#[no_mangle]` 속성은 러스트 컴파일러가 함수 이름을 변경하지 않도록 합니다.

 

3. 데이터 타입 연동

  • 러스트와 C의 기본 데이터 타입은 대부분 호환됩니다. 그러나, 복잡한 데이터 구조를 전달할 때는 주의가 필요합니다.
// 러스트의 String을 C의 char*로 변환하기
let rust_string = String::from("Hello, FFI!");
let c_string = CString::new(rust_string).unwrap();
let ptr = c_string.as_ptr();
  • `CString`은 러스트의 `String`을 C 스타일 문자열로 변환하는 데 사용됩니다.

 

4. 러스트와 C의 메모리 관리

러스트는 소유권 모델을 사용하여 메모리를 자동으로 관리합니다. 반면, C에서는 수동으로 메모리를 할당하고 해제해야 합니다.

// C에서 메모리 할당
int *arr = malloc(sizeof(int) * 10);
// 메모리 해제
free(arr);

 

5. 안전성 고려하기

FFI를 사용할 때는 러스트의 안전성 보장이 약화될 수 있습니다. 따라서, 러스트와 C의 경계에서 데이터 검증과 에러 처리를 철저히 해야 합니다.


러스트와 C 언어의 연동은 성능이나 기존 라이브러리 활용성 때문에 유용할 수 있습니다. 그러나, 이를 위해 필요한 주의 사항과 기술을 잘 이해하고 적용하는 것이 중요합니다.

반응형