티스토리 뷰
연동 방법
CMake C++ 프로젝트와 Rust를 연동하는 방법은 몇 가지가 있음
- 바인딩 코드 자동 생성 관점에서...
- C -> Rust 바인딩 코드 자동생성: bindgen
- C <- Rust 바인딩 코드 자동생성: cbindgen
- C++ <-> Rust 바인딩 코드 자동생성: cxx (dtolnay), autocxx (Google)
- 누가 빌드하냐 관점에서
- rust-lang/cmake
: Rust 프로젝트에서 CMake 호출 - corrosion (https://github.com/corrosion-rs/corrosion)
: CMake에서 Rust 프로젝트를 타겟으로 등록, 빌드
- rust-lang/cmake
링킹 문제
최종 exe를 빌드하는 주체에 따라서 링킹 문제가 꼬임.
추천하는 건 Rust에서는 구멍송송난 static 라이브러리를 만든 뒤, 래핑하는 별도의 C++ CMake 바이너리에서 Rust 라이브러리를 링크하는 방식.
- 링킹 관점에서 필요한 것:
- Rust에서 최종 링킹한다면: C++ 프로젝트에서 의존하는 모든 것 (머리아프다)
- C++ CMake에서 최종 링킹한다면: Rust 표준 라이브러리가 요구하는 리스트만 들어가면 됨
(그것조차도 Corrosion이 대신 해결해줌)
(수동으로 한다면 cargo rustc -q -- --print=native-static-libs 를 찍어본 다음에 수동으로 추가할 것)
Corrosion을 쓰되, Rust 프로젝트도 단독으로 라이브러리는 빌드되도록 하는 방식이 IDE 지원 면에서도 좋음.
- 먼저 사용할 bindgen 라이브러리를 설정해서 build.rs를 열심히 짠다 (staticlib 설정은 필수, 바이너리는 앞에서 언급한 링크 문제가 있으니 만들지 말 것)
- Corrosion을 사용, Rust 프로젝트를 CMake 타겟으로 설정해서 C++ binary (exe) 타겟에 추가함
- PROFIT
이전 정보 (2020-07-29):
flames-of-code.netlify.app/blog/rust-and-cmake-cplusplus/
위 링크 가이드는 bindgen 은 사용하지 않음.
install 타겟
CMake C++ -> C -> Rust + bindgen 로 래핑하는 걸 짰었는데 실패했었고, 그 이유는 install 타겟이 없어서였던걸로.
(위 글 읽어보니 install 타겟은 의존성 있는 라이브러리를 다 설치한다고. 없으니까 당연히 링크 에러 나지...)
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
- mvu
- upbit
- K8s
- 왜 생각이 안 났지
- 쿠버네티스
- C#
- gitea
- 시스어드민
- Godot Engine
- 토이프로젝트
- rust-lang
- Sass
- 업비트
- ActivityPub
- 오라클 클라우드 인프라
- Oracle Cloud Infrastructure
- C++ FAQ
- 오라클 클라우드
- pleroma
- exercism
- 마스토돈
- pdf.js
- javascript
- ArchLinuxARM
- scss
- c++
- 개발기록
- kotlin당했다
- OStatus
- vuex
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |