티스토리 뷰

연동 방법

CMake C++ 프로젝트와 Rust를 연동하는 방법은 몇 가지가 있음

  • 바인딩 코드 자동 생성 관점에서...
    • C -> Rust 바인딩 코드 자동생성: bindgen
    • C <- Rust 바인딩 코드 자동생성: cbindgen
    • C++ <-> Rust 바인딩 코드 자동생성: cxx (dtolnay), autocxx (Google)
  • 누가 빌드하냐 관점에서

링킹 문제

최종 exe를 빌드하는 주체에 따라서 링킹 문제가 꼬임.

추천하는 건 Rust에서는 구멍송송난 static 라이브러리를 만든 뒤, 래핑하는 별도의 C++ CMake 바이너리에서 Rust 라이브러리를 링크하는 방식.

  • 링킹 관점에서 필요한 것:
    • Rust에서 최종 링킹한다면: C++ 프로젝트에서 의존하는 모든 것 (머리아프다)
    • C++ CMake에서 최종 링킹한다면: Rust 표준 라이브러리가 요구하는 리스트만 들어가면 됨
      (그것조차도 Corrosion이 대신 해결해줌)
      (수동으로 한다면 cargo rustc -q -- --print=native-static-libs 를 찍어본 다음에 수동으로 추가할 것)

Corrosion을 쓰되, Rust 프로젝트도 단독으로 라이브러리는 빌드되도록 하는 방식이 IDE 지원 면에서도 좋음.

  1. 먼저 사용할 bindgen 라이브러리를 설정해서 build.rs를 열심히 짠다 (staticlib 설정은 필수, 바이너리는 앞에서 언급한 링크 문제가 있으니 만들지 말 것)
  2. Corrosion을 사용, Rust 프로젝트를 CMake 타겟으로 설정해서 C++ binary (exe) 타겟에 추가함
  3. PROFIT

이전 정보 (2020-07-29):

더보기

 

flames-of-code.netlify.app/blog/rust-and-cmake-cplusplus/

위 링크 가이드는 bindgen 은 사용하지 않음.

install 타겟

CMake C++ -> C -> Rust + bindgen 로 래핑하는 걸 짰었는데 실패했었고, 그 이유는 install 타겟이 없어서였던걸로.

(위 글 읽어보니 install 타겟은 의존성 있는 라이브러리를 다 설치한다고. 없으니까 당연히 링크 에러 나지...)

null 포인터

is_null (제일 이해하기 쉬운 방법)

libc++ 어쩌죠?

println!("cargo:rustc-link-lib=static=stdc++");

dylib도 되고(이게 일반적) 나이틀리에는 minimize 하는 것도 있댔는데 찾아보긴 번거롭네요.

cmake 빌드결과는 어디에?

rust쪽 증분 빌드에.

target/debug/build/my_rust_bin_proj-해시 둘 중 하나 (나머지 하나는 build.rs 용)

디버깅 잘 돼요?

네 (기대 안 했는데 잘 됨 잼)

사실 이게 궁금해서 직접 해봤는데 CLion에서 브포도 잘 잡히고 뒤질 때도 잘 잡힙니다.

다만 bindgen 을 안 쓰니까 C++ 소스 바뀐 걸 감지를 못 하네요. 이거 방법 있다고 인터넷에 나와있었는데 지금 찾아보긴 쫌

잘 되네요

프로젝트 내놔

드...드리겠습니다!

github.com/sftblw/_cpp_rs_interop_test_proj

...객체는 어떻게 하나요?

예전에 열심히 찾아봤었는데 이번엔 테스트 안 해봤네요 그러고보니

see: rust-lang.github.io/rust-bindgen/opaque.html

 

최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함