← 과제 목록

[과제] 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.dllSDL2.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 원문