← 과제 목록

[과제] 1주차) 프로젝트 작업환경 구성 (Windows + MSVC) 조정민

@YoungB0
  • #과제
목차

Windows 11 + MSVC 환경에서 ThorVG와 ThorVG Example을 빌드했습니다.

공식 README의 빌드 안내는 네 줄 정도로 짧은데, 리눅스/맥 기준이라 윈도우에서는 그 앞뒤로 준비할 게 더 있었습니다. 중간에 네 번 정도 막혔고, 아래는 최종적으로 성공한 경로입니다. 겪은 에러도 같이 적어두었으니 같은 환경이신 분들은 참고해 주세요.

image

환경

항목값
OSWindows 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.

image

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

실행 결과

image image image

Lottie, Svg, Animation 예제 모두 정상 동작을 확인했습니다. SVG 예제의 그라디언트나 클리핑 같은 케이스까지 제대로 렌더링되는 걸 보고 환경이 정상이라고 판단했습니다.

아직 이해하지 못한 부분

  • thorvg-1.pc의 Cflags 문제가 제 환경 설정 탓인지, 아니면 비표준 경로에 install할 때 공통으로 생기는 문제인지 아직 확실하지 않습니다. 리눅스에서는 /usr/include가 기본 검색 경로라 드러나지 않을 것 같은데, 확인해 보려고 합니다.
  • GL 엔진을 켜려면 어떤 옵션이 필요한지 아직 못 찾았습니다.
  • MSVC와 MinGW를 섞으면 왜 안 되는지, 헤더 충돌 말고 더 근본적인 이유가 있는지 궁금합니다.

댓글

Discussion 원문