디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

rust-skia 소개

나르시갤로그로 이동합니다. 2025.11.13 22:18:17
조회 132 추천 1 댓글 20

제목: [기술] C/C++ 프로젝트에서 Skia C++ ABI 불일치 문제 해결 방법 (rust-skia 활용)

C/C++로 GUI 툴킷이나 그래픽 애플리케이션을 개발 시 Skia 연동 방법을 공유합니다.

Skia C++ ABI(Application Binary Interface) 불일치는 독립적인 C/C++ 프로젝트 연동 시 발생하는 주요 문제입니다.

Skia는 2D 렌더링 라이브러리이나, Makefile이나 CMake 기반의 프로젝트에서 라이브러리로 링크하여 사용하는 데 어려움이 있습니다.

주요 원인은 C++ ABI 불일치입니다.

  1. Skia는 gn ninja 빌드 시스템을 사용합니다.
  2. gn은 빌드 시 C++ 전처리기 플래그(예: -DSK_GANESH, -DSK_GRAPHITE 등)를 정의합니다.
  3. DisplayParams.h와 같은 Skia 헤더 파일들은 이 플래그(#ifdef SK_GANESH ...)에 따라 구조체의 메모리 레이아웃(크기)이 동적으로 변경됩니다.
  4. C/C++ 프로젝트는 Makefile로 컴파일되므로, gn이 사용한 플래그를 알지 못합니다.
  5. 결과: Makefile이 컴파일한 코드(예: DisplayParams 크기 216바이트)와 gn이 빌드한 libskia.a 라이브러리(예: DisplayParams 크기 240바이트) 간에 구조체 크기가 불일치합니다.

이로 인해 Invalid read 오류나 SIGSEGV (메모리 충돌)가 발생하며, Makefile에서의 사용이 제한되었습니다.

rust-skia (Skia의 Rust 바인딩) 프로젝트는 이 ABI 문제를 해결하는 C API 브리지(Bridge)를 구축합니다.

rust-skia는 Rust에서 C++ Skia를 호출하기 위해, 그 중간에 bindings.cpp라는 C API 계층을 두었습니다.

rust-skia cargo build 프로세스는 다음과 같이 작동합니다.

  1. build.rs 스크립트가 gn ninja를 호출하여 C++ Skia 코어(libskia.a)를 빌드합니다.
  2. gn이 사용한 모든 C++ 컴파일 플래그를 캡처합니다.
  3. bindings.cpp (C API 래퍼)를 2단계에서 캡처한 동일한 플래그로 컴파일합니다.
  4. C++ Skia 코어와 C API 래퍼를 하나의 정적 라이브러리(libskia_bindings.a)로 통합합니다.

이 과정을 통해 libskia_bindings.a 라이브러리 내에서 ABI가 일치하는 바이너리가 생성됩니다.

C 툴킷(guiyom)에서의 활용법

rust-skia가 C API 브리지를 제공하므로, C 개발자는 gn이나 ABI 문제를 회피할 수 있습니다.

rust-skia의 Rust 래퍼(skia-safe) 대신, C API 라이브러리 산출물만 선별하여 사용할 수 있습니다.

1. libskia_bindings.a 라이브러리 확보

  • 방법 A (사전 빌드된 바이너리 사용): rust-skia/skia-binaries 저장소에서 대상 OS에 맞는 사전 빌드된 바이너리(skia-m142-linux-x86_64.tar.gz 등)를 다운로드합니다.
  • 방법 B (FreeBSD/특수 환경): rust-skia 소스 코드를 git clone한 후, cargo build를 실행합니다. (Rust와 ninja, python 필요) 빌드가 완료되면 target/debug/build/skia-bindings-... 폴더에서 libskia_bindings.a 파일을 찾을 수 있습니다.

2. bindings.h 헤더 확보

rust-skia 소스 코드의 skia-bindings/src/bindings.h 파일입니다. (이 파일이 없다면, bindings.cpp extern "C" 함수 선언을 기반으로 skia-c.h 헤더를 직접 작성해야 할 수도 있습니다.)

3. Makefile에서 링크

guiyom C 툴킷의 Makefile 구성은 다음과 같이 단순화됩니다.

# skia-binaries에서 가져온 헤더와 라이브러리 경로
SKIA_INC_PATH = -I/path/to/skia_bindings/include
SKIA_LIB_PATH = -L/path/to/skia_bindings/lib

# C 코드는 C++ 헤더가 아닌 C API 헤더를 포함
g-button.o: g-button.c
    gcc -c g-button.c $(SKIA_INC_PATH)

# C++ 플래그 없이, C 라이브러리처럼 링크
guiyom: g-button.o
    gcc g-button.o -o guiyom \
        $(SKIA_LIB_PATH) \
        -lskia_bindings \
        -lfontconfig -lfreetype -lX11 ... (기타 Skia 의존성)

결론

rust-skia 프로젝트를 통해 C/C++ 개발자는 Skia C++ 빌드 시스템의 복잡성을 회피하고, Makefile 기반의 프로젝트에서 Skia를 C API 라이브러리처럼 사용할 수 있습니다.


PS. 러스트 빠돌이에게 말합니다. 러스트 한 언어만 고집하고 한 언어만 사용하는 건 어리석은 짓입니다. 보시다시피 rust-skia 플젝에서도 c/c++ 언어를 사용합니다. c 언어는 현실적으로 대체 불가능해 요. abi 문제 때문에 c는 알아야되고, rust를 사용하더라도 c 언어를 사용하는 경우가 생깁니다. 현명한 사람은 각 실정에 맞게 여러 언어를 사용합니다.

추천 비추천

1

고정닉 1

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 이성 보는 눈 없어서 걱정되는 스타는? 운영자 25/11/10 - -
AD 겨울가전 SALE! 쿨한 겨울 HOT세일 운영자 25/11/12 - -
2902774 대장동 수괴 정체 파헤치기 [2] ♥KiTTY냥덩♥갤로그로 이동합니다. 08:27 51 0
2902773 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 08:27 28 0
2902772 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 08:27 52 0
2902771 엣헴! [2] ♥KiTTY냥덩♥갤로그로 이동합니다. 08:21 54 0
2902770 귀염만이 모든것을 능가 한당⭐+ By 나님 [2] ♥KiTTY냥덩♥갤로그로 이동합니다. 08:21 62 0
2902769 바이든의 내로남불? ‘스파이웨어 금지’라더니 동맹 도청엔 “…” 발명도둑잡기(118.216) 08:00 19 0
2902768 "홍대 길바닥에 돈을 뿌리게 되죠." - 이센스 [14] 발명도둑잡기(118.216) 07:50 60 0
2902760 ❤✨☀⭐⚡☘⛩☃나님 시작합니당☃⛩☘⚡⭐☀✨❤ ♥KiTTY냥덩♥갤로그로 이동합니다. 06:54 32 0
2902693 무료 제미니, 무료 코파일럿 사용하여 책 원고 작성법 나르시갤로그로 이동합니다. 03:25 30 0
2902688 Eldiron RPG Creator [5] 프갤러(49.165) 02:39 38 0
2902685 도깨비 감투 발명도둑잡기(118.216) 01:33 26 0
2902683 오늘의 소설, 영화 실마리: 물총, 물대포로 싸움 풍자 발명도둑잡기(118.216) 01:24 34 0
2902682 암모니아 기반 육상 발전 솔루션 상업화 추진 발명도둑잡기(118.216) 01:16 28 0
2902681 맘다니처럼, 시애틀에도 ‘민주사회주의자’ 윌슨 시장 당선 [4] 발명도둑잡기(118.216) 01:03 36 0
2902677 <내부자> 발명도둑잡기(118.216) 00:32 22 0
2902676 일본 히키코모리 발명도둑잡기(118.216) 00:26 39 0
2902675 오늘의 발명 실마리: 노래, 영화, 책에 원본 링크 자동 달기 발명도둑잡기(118.216) 00:20 20 0
2902671 나 섹시하냐? [4] ㅇㅇ(222.108) 11.15 128 0
2902669 나님 졸리당.. ♥KiTTY냥덩♥갤로그로 이동합니다. 11.15 28 0
2902668 코딩 에디터 다크배경 vs 화이트배경 [4] ㅇㅇ(14.5) 11.15 71 0
2902667 46세 가난한 도태남이라 울었다 [7] 발명도둑잡기(118.216) 11.15 75 0
2902665 로보트 고깃집 발명도둑잡기(118.216) 11.15 23 0
2902663 선 기부 후 소스공개 프로젝트 발명도둑잡기(118.216) 11.15 40 0
2902661 심리상담이 ‘징계’ 폴더에…삼성은 왜? [박대기의 핫클립] 발명도둑잡기(118.216) 11.15 134 0
2902660 귀염만이 모든것을 능가 한당⭐+ By 나님 ♥KiTTY냥덩♥갤로그로 이동합니다. 11.15 82 0
2902658 역시 프갤은 냥덩이 없으면 망하는구낭 [3] ♥KiTTY냥덩♥갤로그로 이동합니다. 11.15 91 0
2902657 윤석열 - 내 이름 계엄 풀버전 [14] 발명도둑잡기(118.216) 11.15 94 0
2902656 "AI 버블, 지금 당장 돈 빼라"…2년 만에 입 연 월가 예언가의 경고 [1] 발명도둑잡기(118.216) 11.15 33 0
2902655 입시 면접 120% 합격 완벽 솔루션(필승 꿀팁)!I 프갤러(121.142) 11.15 80 2
2902654 군대 월급 발명도둑잡기(118.216) 11.15 22 0
2902653 '축의금 3만원 낸 친구' 눈물의 사연 주인공 밝혀졌다 발명도둑잡기(118.216) 11.15 21 0
2902652 게임기의 한계를 무시한 개발자들이 불가능한 게임을 만든 묘수들 발명도둑잡기(118.216) 11.15 33 0
2902651 오늘은 Ada 라벤스카 프로파일 공부해야지 ㅎㅎ 나르시갤로그로 이동합니다. 11.15 26 0
2902650 나씻주준⭐+ ♥KiTTY냥덩♥갤로그로 이동합니다. 11.15 75 0
2902649 ㄹㅇ 마라톤 휴유증 장난 아닌듯 [2] ♥KiTTY냥덩♥갤로그로 이동합니다. 11.15 89 0
2902648 스트레스 관리의 모범적인 사례 chironpractor갤로그로 이동합니다. 11.15 45 0
2902647 아시아 최대 이랜드 물류센터 화재 발명도둑잡기(118.216) 11.15 34 0
2902646 딱봐도 프갤 좆망한거같은데 대피소 어디임? [6] 프갤러(125.139) 11.15 103 0
2902644 샤오펑, 휴머노이드 로봇 내부 공개… “사람 아닌 진짜 로봇” 해명 발명도둑잡기(118.216) 11.15 31 0
2902643 난 서브 모니터 안씀 ㅇㅇ(14.5) 11.15 44 0
2902642 [애니뉴스] ScanCat1 - 이미지 글자 추출 프로그램 프갤러(121.172) 11.15 54 0
2902641 이번엔 '센토'…주한미군, 한국서 '생화학전 연구' 논란 / JTBC 발명도둑잡기(118.216) 11.15 35 0
2902640 주한미군철거가 발명도둑잡기(118.216) 11.15 25 0
2902639 10대 폭행한 주한미군…"나도 맞았다"더니 CCTV엔? 발명도둑잡기(118.216) 11.15 24 0
2902637 다음 글은 뭐가 문제인가 나르시갤로그로 이동합니다. 11.15 40 0
2902636 나님 왤케 특별하실깡?⭐+ [1] ♥KiTTY냥덩♥갤로그로 이동합니다. 11.15 71 0
2902635 ❤✨☀⭐⚡☘⛩☃나님 시작합니당☃⛩☘⚡⭐☀✨❤ [1] ♥KiTTY냥덩♥갤로그로 이동합니다. 11.15 42 0
2902634 나는조현병이야 나는내향적이야 손발이시립디다갤로그로 이동합니다. 11.15 67 0
2902633 러빨러 오늘 자존심 상하는 일 있었을 듯 [2] 나르시갤로그로 이동합니다. 11.15 53 1
2902632 국민의힘 갤러리 혐오가 된 현상 우리 모두가 작은 배려가 넥도리아(220.74) 11.15 44 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2