디시인사이드 갤러리

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

갤러리 본문 영역

rust-skia 소개

나르시갤로그로 이동합니다. 2025.11.13 22:18:17
조회 150 추천 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/17 - -
AD 겨울가전 SALE! 쿨한 겨울 HOT세일 운영자 25/11/12 - -
2903294 인지과학조져라 손발이시립디다갤로그로 이동합니다. 11.18 46 0
2903293 러스트 담론을 해체하다: 4. '소유권' 모델의 재평가와 설계 철학 나르시갤로그로 이동합니다. 11.18 34 0
2903292 노트북 바이오스 업데이트 완료 ㅇㅇ(119.56) 11.18 27 0
2903291 최원종 이 새끼 진짜 개새네 프갤러(39.7) 11.18 60 0
2903290 히든아이에 최원종 나오는데 프갤러(39.7) 11.18 61 0
2903289 백신들이 프로그램을 감지할 때 [6] 루도그담당(211.184) 11.18 92 0
2903288 드디어 C++ 을 사용하는 이유를 알았다. [1] 프갤러(59.16) 11.18 75 1
2903287 [대한민국] 일, 중 관계 악화 프갤러(121.172) 11.18 18 0
2903286 고백 ㅇㅅㅇ [1] ㅇㅅㅇ(106.102) 11.18 27 0
2903285 취미로 야동데이터베이스 만들고 싶은데 [4] 프갤러(106.245) 11.18 64 0
2903284 [애니뉴스] 유튜브 링크 공유 사이트 제작 시작 프갤러(121.172) 11.18 26 0
2903281 [대한민국] 김용현 장관 재판 2 프갤러(121.172) 11.18 18 0
2903280 [대한민국] 진 커밍스, 한미 조인트 팩트시트 비판… “韓 주권, 美에 프갤러(121.172) 11.18 48 0
2903279 나는 정신병자다 [2] 프갤러(182.231) 11.18 83 1
2903278 푸걀 개좆망했네 니기미 좆같은 글베이새끼들 [12] 프갤러(182.231) 11.18 107 0
2903277 챗GPT 인간형 AI 페르소나 ㅇㅇ(39.7) 11.18 28 0
2903276 14분동안 생각한 결과 : [1] 재현갤로그로 이동합니다. 11.18 61 0
2903275 AI로 과제 날먹하는 것도 능력이다 [10] 재현갤로그로 이동합니다. 11.18 105 0
2903266 울트라모드라매 시발련아 프갤러(223.194) 11.18 61 0
2903258 웹히키같은 새끼들이 게시판 점령했네 ㅇㅇ(222.108) 11.18 52 0
2903216 마스터플랜의 망령 ㅇㅇ(211.216) 11.18 45 0
2903183 쓰읍 쇼부(211.234) 11.18 37 0
2903174 러스트 담론을 해체하다: 3. '안전성' 서사의 다각적 분석 나르시갤로그로 이동합니다. 11.18 73 0
2903161 러스트 담론을 해체하다: 2. 러스트 채택 요인 나르시갤로그로 이동합니다. 11.18 41 0
2903158 러스트 담론을 해체하다: 1. 러스트 언어 소개 및 주요 특징 나르시갤로그로 이동합니다. 11.18 61 0
2903157 ㅅㅂ 여기 제2의 원종이들 많노 ㅇㅇ(49.168) 11.18 43 0
2903156 밤에 집앞에서 보이는 풍경..ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 11.18 50 0
2903155 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 11.18 35 0
2903152 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 11.18 56 0
2903150 Ai 딜도코딩 프갤러(49.165) 11.18 36 0
2903148 에어로홍 그래도 괜찮은 인간이었는데 어쩌다 조현병이 들어서.. ㅇㅇ(218.149) 11.18 53 0
2903139 발명도둑잡기가 호감고닉되려면 할일 [6] 박민준갤로그로 이동합니다. 11.18 100 5
2903137 병신새끼야 정치얘기는 정사갤가서 하라고 [5] 박민준갤로그로 이동합니다. 11.17 106 4
2903134 러스트 담론을 해체하다: 머리말 [3] 나르시갤로그로 이동합니다. 11.17 55 0
2903132 형들 도와줘 해킹 [11] 프갤러(1.235) 11.17 118 0
2903131 fa쪽으로 일하는 사람들은 보통 전공 뭐임?? [1] 프갤러(59.21) 11.17 71 0
2903127 [애니뉴스] ImagesToPdf 이미지 파일 PDF로 변환 개발 끝- 프갤러(121.172) 11.17 47 0
2903121 ㅈ같더라도 버텨야하나 [8] ㅇㅇ(124.48) 11.17 89 1
2903120 진짜 물어 볼 곳이 정 없어서 여기서 물어 봄 제바류 [6] 프갤러(220.82) 11.17 81 0
2903117 바이브 코딩 볼때마다 아찔하던데 ㅋㅋ ㅇㅇ갤로그로 이동합니다. 11.17 61 0
2903103 독학할만한 책같은거 추천해주실수 있나요? [1] ㅇㅇ갤로그로 이동합니다. 11.17 47 0
2903097 4년차 월 580받는데 개사기였구나 [4] 프갤러(211.235) 11.17 103 0
2903093 데브시스터즈와 불고기 브라더스가 합병하면 [2] ㅇㅇ(49.165) 11.17 38 0
2903086 Lua VM과 JIT을 "짧고 정갈하게, 어려운 걸 쉽게 풀었다" [6] 나르시갤로그로 이동합니다. 11.17 59 0
2903085 핸드폰 샀는데 서울 수도권에서 Xperia C3 케이스 파시는 없을까요 넥도리아(220.74) 11.17 45 0
2903084 Lua VM과 JIT: 단순함 속의 강력함 나르시갤로그로 이동합니다. 11.17 50 0
2903083 소프트웨어 연구하는 석학 모아놓고 라이브코딩한다길래 [1] ㅇㅇ(118.216) 11.17 78 0
2903081 이력서 제목은 뭐 어떻게 해야하나? [2] 프갤러(110.8) 11.17 60 0
2903077 AI 바이브 코딩 인생 40 년 갈아 넣었습니다. 프갤러(59.16) 11.17 38 0
2903076 AI 인생 40 년 갈아 넣었습니다. 프갤러(59.16) 11.17 46 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2