Vcpkg (Visual C++ Package Manager)

Seongcheol Jeon·2024년 9월 23일
0

CPP

목록 보기
1/47
post-thumbnail

vcpkg 란?

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

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

더 자세한 정보를 얻고 싶다면 이 영상(youtube)을 참고하기를 바란다.

vcpkg를 사용해야 하는 이유

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

vcpkg 설치

vcpkg repository 클론

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

bootstrap 스크립트 실행

Windows

cd vcpkg && bootstrap-vcpkg.bat

Linux & MacOS

cd vcpkg && bootstrap-vcpkg.sh

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

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

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

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

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

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

vcpkg 사용 방법

라이브러리 검색

vcpkg search <package_name>

ex) vcpkg search fmt

라이브러리 설치

vcpkg install <package_name>

ex) vcpkg install fmt

라이브러리 제거

vcpkg remove <package_name>

ex) vcpkg remove fmt

vcpkg를 이용한 C++ Build

global하게 사용

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

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

vcpkg install fmt

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

// main.cpp

#include <fmt/core.h>

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

CMakeLists.txt 파일 작성

# 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 단에서 설정해주자.

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

혹은

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

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

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

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

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

vcpkg new --application

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

vcpkg add port fmt

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

{
  	"dependencies": [
      	"fmt"
    ]
}

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


Reference

Install and use packages with CMake

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

0개의 댓글