디시인사이드 갤러리

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

갤러리 본문 영역

rust-skia 소개

나르시갤로그로 이동합니다. 2025.11.13 22:18:17
조회 125 추천 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 - -
공지 프로그래밍 갤러리 이용 안내 [97] 운영자 20.09.28 48674 65
2902597 요새 개발 중인 귀욤 GUI 툴킷 [3] 나르시갤로그로 이동합니다. 12:17 7 0
2902596 코인UI + 멀티봇 돌리는중 hiya갤로그로 이동합니다. 11:56 12 0
2902595 도잡이햄의 빠른 전향을 기원합니다 [4] chironpractor갤로그로 이동합니다. 11:44 29 1
2902594 어제 작성한 Ada 코드 [3] 나르시갤로그로 이동합니다. 11:21 22 0
2902593 살다 살다 오늘은 500점이 뜰거야 하더니 e머니가 500점이 뜨네.. 넥도리아(220.74) 11:12 15 0
2902592 프로그래머는 노화땜에 40대후반이 한계다 프갤러(14.63) 11:09 29 0
2902587 ⭐나님이 개발한 의료 AI 강의 플랫폼 런칭 완료⭐ [2] 따당갤로그로 이동합니다. 10:03 46 0
2902586 내 좃만한 뇌로는 곧 살다 뒤진다는걸 받아들일수가 없는데 [5] 깃깃갤로그로 이동합니다. 09:16 41 0
2902585 네카라쿠배 곧이다냥 조루리(118.235) 08:43 33 0
2902584 ㅜ.. 조루리(118.235) 08:42 16 0
2902582 벚나무 세그루..ㅇㅅㅇ [1] 헤르 미온느갤로그로 이동합니다. 08:13 18 0
2902581 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 08:10 13 0
2902580 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 08:09 20 0
2902578 ❤✨☀⭐⚡☘⛩☃나님 시작합니당☃⛩☘⚡⭐☀✨❤ [1] ♥KiTTY냥덩♥갤로그로 이동합니다. 07:43 31 0
2902573 서민정, 제가 돈이 궁했어요 발명도둑잡기(118.216) 04:35 23 0
2902570 알 수 없는 대미 투자액, 2000→3500→6000→9500, 진실은? 발명도둑잡기(118.216) 04:13 31 0
2902569 빌리 아일리시 한국인 3500~9500억달러 상납에 대해서는 발명도둑잡기(118.216) 04:08 17 0
2902564 49.165 발명도둑잡기(118.216) 03:32 44 0
2902562 환율 더 올라라. [1] 프갤러(49.165) 03:09 47 0
2902558 우리들의 일그러진 국가보안법 발명도둑잡기(118.216) 02:58 14 0
2902556 자주연합, 이정훈 대표에 대한 국가보안법 선고를 무효화하라! 발명도둑잡기(118.216) 02:28 43 0
2902554 트럼프는 미국을 바꾼 것이 아니라, 그 본모습을 드러냈다 발명도둑잡기(118.216) 02:16 15 0
2902553 전시작전권조차 없는 미군위안부대 노예 새끼들이 무슨 핵무기를 거론하나? 발명도둑잡기(118.216) 02:04 26 0
2902552 한국인 정치효능감이 독일보다 낮은 이유는 발명도둑잡기(118.216) 01:59 25 0
2902551 전에 자바 스윙 푸념하고 간 유동인데 [7] 프갤러(182.222) 01:57 64 0
2902549 오늘의 연구 실마리: 국가보안법이 다당제로의 선거제 개혁을 막는 기제 발명도둑잡기(118.216) 01:54 16 0
2902548 환율 1500 찍는다던 2찍틀딱들 다 어디감? 야옹아저씨갤로그로 이동합니다. 01:35 39 0
2902547 삼성 #flow, #bada, #웨이브 발명도둑잡기(118.216) 01:23 67 0
2902532 배달의민족은 독일 회사다 발명도둑잡기(118.216) 11.14 36 0
2902531 이재명은 재림예수인 듯 [3] 발명도둑잡기(118.216) 11.14 59 0
2902530 이재명이 사실적시 명예훼손 없애라고 해서, 정말 억울해서 쓴다. 브레이버갤로그로 이동합니다. 11.14 47 0
2902529 한류와 flow 발명도둑잡기(118.216) 11.14 20 0
2902526 이사하려고 갔더니 저희집이 더 큰 것 같해요. 평수만 보지 않고 넥도리아(220.74) 11.14 27 0
2902525 신입 개발자 오늘 한 일.list [1] cvs.갤로그로 이동합니다. 11.14 86 0
2902524 서울 유명 스웨디시 후기 모음집 ㅇㅇ(118.235) 11.14 32 0
2902523 오늘의 영상 기획 실마리: 연예인 유형별 수능 성적 비교 발명도둑잡기(118.216) 11.14 16 0
2902522 나님 기발한 아이디어 원천의 비밀⭐ [1] ♥KiTTY냥덩♥갤로그로 이동합니다. 11.14 68 0
2902521 나님 아이큐 138정도 되니 이런 천재적인 발상도 가능한둣?!? [2] ♥KiTTY냥덩♥갤로그로 이동합니다. 11.14 74 0
2902520 MOONBONA(문보나) _ FIND 발명도둑잡기(118.216) 11.14 30 0
2902519 나님 비즈니스 천재 ㅆㅅㅌㅊ !! ♥KiTTY냥덩♥갤로그로 이동합니다. 11.14 55 0
2902518 [특허] 디시도 유료 아이템 출시해야함 [3] ♥KiTTY냥덩♥갤로그로 이동합니다. 11.14 49 0
2902517 유럽 몇몇 복지국가에서는 대중들이 고가품(명품) 숭배 현상이 없다고 한다 발명도둑잡기(118.216) 11.14 26 0
2902516 c# 중괄호 컨벤션 왤케 적응이 안되냐 [2] 프갤러(220.86) 11.14 46 0
2902515 30년 전쯤에 말에 관해 신문에서 읽었던 칼럼 생각이 난다 발명도둑잡기(118.216) 11.14 31 0
2902514 화교의 속마음 프갤러(211.210) 11.14 29 0
2902513 1323 ♥KiTTY냥덩♥갤로그로 이동합니다. 11.14 49 0
2902511 나님 왤케 특별하실깡? ♥KiTTY냥덩♥갤로그로 이동합니다. 11.14 59 0
2902510 중요한걸 글수가아니라 글/댓글 비율임 [3] 헬마스터갤로그로 이동합니다. 11.14 47 0
2902509 1년만에 밤에 커피 마셔볼까 발명도둑잡기(118.216) 11.14 17 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2