Post

[Programming/C++] VCPKG (Visual C++ Package Manager)

vcpkg는 C++ 라이브러리 의존성을 손쉽게 설치하고 관리할 수 있는 패키지 매니저다. CMake와 연동하여 플랫폼별 빌드 설정을 자동화하고, 일관된 의존성 관리를 지원한다.

[Programming/C++] VCPKG (Visual C++ Package Manager)

vcpkg 란?

vcpkg는 Microsoft에서 개발한 이 도구는 원래 Visual C++ 개발 환경에서 패키지 관리를 쉽게 하기 위해 만들어졌다. 그 이후로 Microsoft에서 배포하고 C++ 커뮤니티에서 유지 및 관리하는 오픈 소스 C/C++ 패키지 관리자가 되었다. 또한 CMake와 같은 다양한 빌드 시스템과 통합되어, C++ 프로젝트에서 라이브러리 의존성을 관리하는 데 널리 사용되고 있다. Python의 pip, Node.js의 npm, Rust의 cargo 등과 비슷한 기능을 한다. 그리고 내부적으로 라이브러리의 소스코드를 다운받아, 직접 컴파일하는 방식을 사용한다. 참고로 미리 build된 binary를 제공하지 않는 이유는 다음과 같다.

  • 플랫폼 다양성
    • 여러 운영 체제(Windows, MacOS, Linux)를 지원해야 하므로, 각 플랫폼에 맞춘 바이너를 제공하기 어렵다.
  • 설정 유연성
    • 사용자가 각기 다른 컴파일 옵션이나 설정을 사용할 수 있기 때문에, 직접 빌드하는 것이 더 유연하다.
  • 라이브러리 버전 관리
    • 프로젝트마다 요구하는 라이브러리 버전이 달라, 특정 버전에 종속되지 않도록 직접 컴파일을 권장한다.
  • 일관된 빌드 환경
    • 소스에서 빌드하는 것이 의존성 관리와 디버깅에 일관성을 제공한다.

더 자세한 정보를 얻고 싶다면 아래의 영상을 참고하기를 바란다.

vcpkg를 사용해야 하는 이유

  • 2,200개가 넘는 오픈 소스 라이브러리를 선택하여 쉽게 설치할 수 있다.
  • Windows, MacOS, Linux에 대한 일관된 플랫폼 간 환경을 조성할 수 있다.
  • 필요에 따라 원본에서 종속성을 빌드하고, 특정 요구 사항에 대한 사용자 지정을 제공한다.
  • 패키지와 프로젝트 간의 ABI 비호환성을 방지한다.
  • 종속성 그래프 버전 충돌 및 다이아몬드 문제를 방지한다.
  • 게임, 임베디드/IoT, 금융 등 여러 산업의 C/C++ 개발자가 이를 사용중이다.
  • MSBuildCMake 사용자의 경우, 원활한 종속성 환경을 통해 빌드 환경을 구성할 수 있다.

vcpkg 설치

vcpkg repository 클론

1
git clone https://github.com/microsoft/vcpkg.git

bootstrap 스크립트 실행

Windows

1
cd vcpkg && bootstrap-vcpkg.bat

Linux & MacOS

1
cd vcpkg && bootstrap-vcpkg.sh

자동 완성을 위한 명령어 실행

본인에게 맞는 shell 타입을 지정한다.

1
./vcpkg integrate [bash | zsh | ...]

환경 변수 등록 [선택 사항]

1
2
export VCPKG_ROOT="${HOME}/vcpkg"
export PATH="${PATH}:${VCPKG_ROOT}"

여기까지 모두 진행했다면 설치는 끝이다.

vcpkg 사용 방법

라이브러리 검색

1
2
3
vcpkg search <package_name>

ex) vcpkg search fmt

라이브러리 설치

1
2
3
vcpkg install <package_name>

ex) vcpkg install fmt

라이브러리 제거

1
2
3
vcpkg remove <package_name>

ex) vcpkg remove fmt

vcpkg를 이용한 C++ Build

global하게 사용

다음은 fmt 라이브러리를 추가해서 빌드한다고 가정하는 예이다.

우선, vcpkgfmt 패키지를 설치해야 한다.

1
vcpkg install fmt

간단한 C++ 코드 작성을 해 보자.

1
2
3
4
5
6
7
8
9
10
// main.cpp

#include <fmt/core.h>

int main()
{
  fmt::print("Hello World!\n");

  return 0;
}

CMakeLists.txt 파일 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# cmake 최소 버전 명시
cmake_minimum_required(VERSION 3.20)

# 프로젝트 이름
project(test_pkg_mgr)

# 타겟 프로그램 정의
add_executable(main main.cpp)

# 프로젝트에서 사용할 수 있도록 패키지 검색
find_package(fmt CONFIG REQUIRED)

# 타겟 프로그램을 링킹할 때 필요한 라이브러리 지정
target_link_libraries(main PRIVATE fmt::fmt)

이렇게 작성 후 cmake . 명령을 실행하면, fmt를 찾을 수 없다는 에러를 맞닥뜨릴 것이다. 그 이유는 cmake는 아직 vcpkg의 존재를 모르기 때문이다. 따라서 cmake에게 vcpkg의 존재를 알려야 한다. 다음과 같이 configure 단에서 설정해주자.

1
2
# tool chain 사용
cmake -S . -B build --toolchain=<vcpkg_dir>/scripts/buildsystems/vcpkg.cmake

혹은

1
2
# tool chain file 사용
cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=<vcpkg_dir>/scripts/buildsystems/vcpkg.cmake

이렇게 빌드하면, 잘 진행되는 것을 볼 수 있다. 그 후 실행파일을 만들기 위해 빌드를 진행하면 끝이다.

1
2
# 실행 파일 빌드
cmake --build build

Project 별로 패키지 설치 후 사용 (manifest)

진행중인 혹은 진행할 디렉토리로 이동 후 아래의 명령을 실행하자.

1
vcpkg new --application

그러면 vcpkg-configuration.json, vcpkg.json 파일이 생성될 것이다. 그 후 fmt패키지를 추가한다.

1
vcpkg add port fmt

이렇게 추가하면 vcpkg.json 파일이 다음과 같이 되어있을 것이다.

1
2
3
4
5
{
  "dependencies": [
    "fmt"
  ]
}

이것이 매니페스트(manifest) 파일이다. vcpkg는 매니페스트 파일을 읽어 설치할 종속성을 알아보고, CMake와 통합하여 프로젝트에 필요한 종속성을 제공한다.


🔗 References

Install and use packages with CMake

CLion을 사용중인 개발자는 여기를 참고하면 된다.

This post is copyrighted by the author. All rights reserved.