디시인사이드 갤러리

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

갤러리 본문 영역

rust-skia 소개

나르시갤로그로 이동합니다. 2025.11.13 22:18:17
조회 110 추천 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 48664 65
2902488 코매 프갤 했었노 ♥KiTTY냥덩♥갤로그로 이동합니다. 18:43 16 0
2902487 ㅋㅅㅋ [1] ♥KiTTY냥덩♥갤로그로 이동합니다. 17:59 21 0
2902486 비트코인 창시자 죽엇넹 [6] ♥KiTTY냥덩♥갤로그로 이동합니다. 17:23 73 0
2902485 주말인데 내가 관심있는 여성들 [1] 발명도둑잡기(118.216) 17:20 32 0
2902484 신입 4800이면 ㄱㅊ은거냐? [1] 프갤러(220.94) 16:57 30 0
2902483 보안걸려있는 컴으로 웹으로 코딩할수있는데 있냐 [1] 미카앨갤로그로 이동합니다. 16:15 29 0
2902482 주 4일 반대하는 이유 ㅇ ㅅㅇ [2] 프갤러(60.196) 16:10 36 0
2902481 자체 솔루션 가진 솔루션 엔지니어 괜찮음? 프갤러(106.102) 15:50 26 0
2902480 님들 저 대학교때 플래시게임만들던 기억삼아서 코딩다시배우는데 프갤러(175.117) 15:32 31 0
2902479 감기기운.. [2] ♥KiTTY냥덩♥갤로그로 이동합니다. 15:15 44 0
2902478 FreeBSD 비공식 포트: gcc14-ada 나르시갤로그로 이동합니다. 14:37 21 0
2902477 고닉달고 글 1만개 이상 쓴 새끼들은 뭐하는 새끼들임? [2] 프갤러(112.171) 14:02 52 0
2902476 Guiyom 아키텍처 분석: 독창성 및 특허 가능성 검토 [2] 나르시갤로그로 이동합니다. 13:23 32 0
2902475 [대한민국] [대통령 관련 재판 문서정리]법관윤리강령과 판사 선서문 프갤러(121.172) 12:35 13 0
2902474 팀노바 빛을 발할때다 [9] 개멍청한유라갤로그로 이동합니다. 12:24 82 0
2902473 공공데이터포털 안되는데 저만 그런가요? 프갤러(121.146) 12:16 21 0
2902472 내가 10년전부터 전쟁나야한다할때는 재벌기득권들웃고자빠져 살더니 타이밍뒷.통수한방(1.213) 12:09 23 1
2902471 선생님 운전면허증 동안양경찰서에 습득물 신고 하였습니다. 넥도리아(223.38) 12:08 18 0
2902470 동안양경찰서 방문 [2] 넥도리아(223.38) 11:47 29 0
2902468 vs2019 테마 추천 좀 XEON갤로그로 이동합니다. 10:47 17 0
2902467 6년차 6천찍었다 [2] 프갤러(202.8) 10:09 69 0
2902466 여기 sap하는 형들도 있나 [3] 프갤러(118.235) 09:51 55 0
2902464 국비 수료했는데 취업할 수 있을까 [3] 쿠웩갤로그로 이동합니다. 09:17 78 0
2902463 흑흑.. ㅠㅠ [1] 헤르 미온느갤로그로 이동합니다. 09:16 31 0
2902462 파이썬 인생 40 년 갈아 넣었습니다. [1] 프갤러(59.16) 09:00 50 0
2902461 곧 경제적 자유 달성 프갤러(218.154) 08:54 45 0
2902460 금요일은 출근 하기 싫다 ㅇㅅㅇ [4] 류류(210.105) 08:48 39 1
2902459 요즘에도 이클립스 쓰네 ㄷㄷ [3] ㅇㅇ(14.5) 08:28 58 0
2902458 ‘우크라 재건 주가조작’ 웰바이오텍 회장 체포 발명도둑잡기(118.216) 08:11 19 0
2902457 단풍 ㅇㅅㅇ [1] 헤르 미온느갤로그로 이동합니다. 08:08 26 0
2902456 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 08:07 19 0
2902455 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 08:07 41 0
2902454 [발명품] 화장품 회사가 만든 '노크 만년필' 발명도둑잡기(118.216) 08:04 24 0
2902453 방금 전 인스타그램 자동 추천 사진 검색 발명도둑잡기(118.216) 07:47 49 0
2902451 즐거운 목요일 아침입니다~ [2] 가연아갤로그로 이동합니다. 07:34 54 0
2902450 윈도우즈 '지뢰찾기' 게임의 원조 [1] 발명도둑잡기(118.216) 07:21 40 0
2902449 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ [2] ♥KiTTY냥덩♥갤로그로 이동합니다. 07:05 52 0
2902448 [단독]트럼프 “中에 100% 추가관세” 경고한 날, 국내코인 616억 [1] 발명도둑잡기(118.216) 06:23 33 0
2902447 “돈 내고 재미로 저격”… 보스니아 내전 ‘인간사냥 관광’ 수사 개시 발명도둑잡기(118.216) 06:21 23 0
2902446 “보안 뚫리면 국가안보까지 위험… 대규모 투자 시급” 발명도둑잡기(118.216) 05:56 29 0
2902445 자본과 검열의 관계 발명도둑잡기(118.216) 05:46 80 0
2902444 고졸의 덕담 발명도둑잡기(118.216) 05:25 21 0
2902443 리눅스 러시아인 차단 분쟁 후 포크 cinux 등장 발명도둑잡기(118.216) 05:15 23 0
2902442 전국 1등 관련 생각나는 예전 글 발명도둑잡기(118.216) 04:20 35 0
2902441 영회 <광해> 관련해서 생각나는 예전 글 발명도둑잡기(118.216) 04:10 28 0
2902440 Paws and Effect - AI Destroyed The Digit 발명도둑잡기(118.216) 04:03 23 0
2902439 팔란티어가 본 미래는? AI 방산 기업의 위험한 질주 / 오그랲 / 비디 [1] 발명도둑잡기(118.216) 03:50 40 0
2902431 성형외과에서 일했을때 개충격적인 발명도둑잡기(118.216) 02:47 55 0
2902430 왕족 변우석과 평민 아이유라니…베일 벗은 '21세기 대군부인' 발명도둑잡기(118.216) 02:36 35 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2