Windows 11 + MSVC 환경에서 ThorVG와 ThorVG Example을 빌드했습니다.
공식 README의 빌드 안내는 네 줄 정도로 짧은데, 리눅스/맥 기준이라 윈도우에서는 그 앞뒤로 준비할 게 더 있었습니다. 중간에 네 번 정도 막혔고, 아래는 최종적으로 성공한 경로입니다. 겪은 에러도 같이 적어두었으니 같은 환경이신 분들은 참고해 주세요.
환경
| 항목 | 값 |
|---|---|
| OS | Windows 11 |
| 컴파일러 | MSVC 19.51 (Visual Studio Build Tools 2026) |
| 빌드 시스템 | Meson 1.11.2 + Ninja 1.13.0 |
| 패키지 매니저 | vcpkg, MSYS2(pkg-config 용도) |
| 터미널 | x64 Native Tools Command Prompt |
참고로 제 PC에는 대학 C++ 수업 때 VS Code에서 컴파일하려고 설정해 둔 MSYS2(UCRT64)가 이미 있었습니다. 시스템 PATH에도 등록되어 있는 상태였는데, 이게 뒤에서 MSVC와 충돌하는 원인이 됐습니다. 같은 상황이신 분들은 트러블슈팅 부분을 먼저 보셔도 좋을 것 같습니다.
왜 MSVC로 갔나
MSYS2가 이미 있어서 MinGW로 빌드하는 방법도 있었지만, MSVC를 선택했습니다.
- ThorVG 공식 문서와
meson.build가 MSVC를 전제로 한 분기를 갖고 있습니다 - 다른 멘티분들과 환경이 겹쳐야 질문과 답변이 통할 것 같았습니다
- 윈도우 네이티브 빌드라 나중에 디버깅할 때도 유리할 것 같았습니다
결과적으로는 MSYS2가 남아 있던 것 때문에 오히려 더 헤맸지만, 그 과정 자체가 기록으로 남을 만하다고 생각합니다.
1. 컴파일러 설치
윈도우에는 C++ 컴파일러가 기본으로 없어서 먼저 설치해야 합니다.
Visual Studio 다운로드 페이지에서 Build Tools를 받고, 워크로드에서 “C++를 사용한 데스크톱 개발” 하나만 체크하면 됩니다. 약 6.5GB.
IMPORTANT
설치 후 시작 메뉴에서 “x64 Native Tools Command Prompt” 를 사용하세요.
그냥 “Developer Command Prompt”를 열면 32비트(x86)로 잡힙니다. 이름이 비슷한 게 여러 개 있는데, x64_x86 Cross Tools는 결과물이 32비트라 다릅니다.
cl을 쳤을 때 for x64가 나오는지 확인하시면 됩니다.
2. meson, ninja 설치
pip install meson ninja
3. pkg-config 설치
Example 빌드에 pkg-config가 필요한데 윈도우에는 없습니다. MSYS2가 이미 있어서 거기서 받았습니다.
# MSYS2 UCRT64 셸에서
pacman -S mingw-w64-ucrt-x86_64-pkgconf
실행 파일 위치는 C:\msys64\ucrt64\bin\pkg-config.exe 입니다. MSYS2가 없으시면 chocolatey의 pkgconfiglite를 쓰셔도 됩니다.
4. SDL2 설치 (vcpkg)
git clone https://github.com/microsoft/vcpkg.git
cd vcpkg
.\bootstrap-vcpkg.bat
.\vcpkg install sdl2:x64-windows
:x64-windows는 트리플렛이라고 하는데, “64비트 윈도우용으로 빌드하라”는 지정입니다. 안 붙이면 32비트가 기본이라 또 꼬입니다.
WARNING
처음에는 MSYS2에서 pacman -S mingw-w64-ucrt-x86_64-SDL2로 받았는데, MSVC와 같이 쓰니 빌드가 깨졌습니다. 아래 트러블슈팅 참고.
vcpkg는 소스를 받아서 MSVC로 직접 컴파일해 주기 때문에 이 문제가 없습니다. 설치 로그에도 Compiler found: .../MSVC/.../cl.exe가 찍힙니다.
5. ThorVG 빌드 & 설치
git clone https://github.com/thorvg/thorvg.git
cd thorvg
meson setup builddir
meson configure builddir --prefix=C:/Users/<사용자명>/dev/install
ninja -C builddir install
Example이 pkg-config로 thorvg를 찾기 때문에, 빌드만 하지 말고 install까지 해야 합니다. install 과정에서 thorvg-1.pc 파일이 생성되고, pkg-config는 이 파일을 읽어서 헤더와 라이브러리 위치를 알아냅니다.
prefix를 지정하지 않으면 기본값이 C:/ 루트라 C:\include, C:\lib 같은 폴더가 생깁니다.
6. 환경 변수 설정
set PKG_CONFIG_LIBDIR=C:/Users/<사용자명>/dev/install/lib/pkgconfig;C:/Users/<사용자명>/dev/vcpkg/installed/x64-windows/lib/pkgconfig
set PATH=%PATH%;C:\msys64\ucrt64\bin;C:\Users\<사용자명>\dev\install\bin;C:\Users\<사용자명>\dev\vcpkg\installed\x64-windows\bin
확인:
pkg-config --modversion thorvg-1 → 1.0.0
pkg-config --cflags sdl2 → vcpkg 경로가 나와야 함 (msys64가 나오면 안 됨)
PATH에 install\bin과 vcpkg의 bin을 넣는 이유는, 실행 시점에 thorvg-1.dll과 SDL2.dll을 찾아야 하기 때문입니다. 컴파일할 때 쓰는 .lib와는 별개입니다.
매번 치기 번거로워서 .bat 파일로 만들어 두고 씁니다.
@echo off
set PKG_CONFIG_LIBDIR=...
set PATH=%PATH%;...
echo [ThorVG] 환경 설정 완료
NOTE
이 .bat은 더블클릭하면 안 되고, x64 Native Tools Command Prompt 안에서 실행해야 합니다. set은 해당 창에서만 유효하기 때문입니다.
7. Example 빌드 & 실행
git clone https://github.com/thorvg/thorvg.example.git
cd thorvg.example
meson setup builddir
ninja -C builddir
.\builddir\src\Lottie.exe
meson setup 출력에서 아래 세 줄이 모두 YES면 준비된 것입니다.
Run-time dependency thorvg-1 found: YES 1.0.0
Run-time dependency sdl2 found: YES 2.32.10
Run-time dependency gl found: YES
트러블슈팅
MSYS2 SDL2를 쓰면 표준 헤더에서 에러가 쏟아집니다
MSYS2가 이미 설치되어 있어서 SDL2도 pacman으로 받았는데, 이게 문제였습니다.
C:\msys64\ucrt64\include\math.h(213): error C2065: '__asm__': 선언되지 않은 식별자입니다.
C:\msys64\ucrt64\include\stdio.h(478): error C2061: 구문 오류: 식별자 '__builtin_va_list'
C:\msys64\ucrt64\include\stdio.h(933): fatal error C1003: 오류 수가 100개를 초과했습니다.
__asm__, __builtin_va_list는 GCC 쪽 문법으로 알고 있는데, MSVC가 이걸 해석하지 못해서 나는 에러로 보입니다.
원인은 include 경로였습니다. SDL2의 .pc 파일이 C:/msys64/ucrt64/include를 넘겨주는데, 이 폴더에는 SDL2 헤더뿐 아니라 MinGW의 표준 라이브러리 헤더(stdio.h, math.h 등)도 함께 들어 있습니다. 그래서 MSVC가 자기 stdio.h 대신 MinGW 것을 읽어버렸습니다.
→ vcpkg로 SDL2를 다시 설치하니 해결됐습니다.
vcpkg로 바꿨는데도 MSYS2 경로가 계속 잡힙니다
PKG_CONFIG_PATH에 vcpkg 경로를 추가했는데도 소용이 없었습니다.
> pkg-config --cflags sdl2
-IC:/msys64/ucrt64/bin/../include -IC:/msys64/ucrt64/bin/../include/SDL2
예전에 MSYS2를 설치하면서 C:\msys64\ucrt64\bin을 시스템 PATH에 영구 등록해 둔 상태였고, 그래서 pkg-config가 자기 기본 경로에서 MSYS2 쪽 .pc를 먼저 찾고 있었습니다.
→ PKG_CONFIG_PATH 대신 PKG_CONFIG_LIBDIR 을 썼습니다. 전자는 기본 경로에 추가하는 것이고, 후자는 기본 경로를 아예 대체합니다.
> pkg-config --cflags sdl2
-IC:/Users/.../vcpkg/installed/x64-windows/include -IC:/Users/.../vcpkg/installed/x64-windows/include/SDL2
thorvg.h를 못 찾습니다
Example.h(30): fatal error C1083: 포함 파일을 열 수 없습니다. 'thorvg-1/thorvg.h'
소스는 #include <thorvg-1/thorvg.h>로 찾는데, install로 생성된 thorvg-1.pc의 Cflags가 이렇게 되어 있었습니다.
Cflags: -I${includedir}/thorvg-1
이러면 최종 경로가 include/thorvg-1/thorvg-1/thorvg.h가 되어 thorvg-1이 두 번 들어갑니다.
→ .pc 파일을 직접 수정했습니다.
Cflags: -I${includedir} -I${includedir}/thorvg-1
C:\Users\<사용자명>\dev\install\lib\pkgconfig\thorvg-1.pc 를 메모장으로 열어 마지막 줄만 바꾸고, builddir을 지운 뒤 meson setup부터 다시 하면 됩니다.
GL 엔진이 꺼져 있습니다
meson setup 요약에 GL : NO로 나와서, 과제 예시의 Animation gl은 실행되지 않았습니다. 기본값인 소프트웨어 렌더링(sw)으로 확인했습니다.
Raster Engine
CPU : YES
GL : NO
WebGPU : NO
실행 결과
Lottie, Svg, Animation 예제 모두 정상 동작을 확인했습니다. SVG 예제의 그라디언트나 클리핑 같은 케이스까지 제대로 렌더링되는 걸 보고 환경이 정상이라고 판단했습니다.
아직 이해하지 못한 부분
thorvg-1.pc의 Cflags 문제가 제 환경 설정 탓인지, 아니면 비표준 경로에 install할 때 공통으로 생기는 문제인지 아직 확실하지 않습니다. 리눅스에서는/usr/include가 기본 검색 경로라 드러나지 않을 것 같은데, 확인해 보려고 합니다.- GL 엔진을 켜려면 어떤 옵션이 필요한지 아직 못 찾았습니다.
- MSVC와 MinGW를 섞으면 왜 안 되는지, 헤더 충돌 말고 더 근본적인 이유가 있는지 궁금합니다.
댓글
Discussion 원문