[Programming/C++] VCPKG (Visual C++ Package Manager)
vcpkg는 C++ 라이브러리 의존성을 손쉽게 설치하고 관리할 수 있는 패키지 매니저다. CMake와 연동하여 플랫폼별 빌드 설정을 자동화하고, 일관된 의존성 관리를 지원한다.
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++개발자가 이를 사용중이다. MSBuild및CMake사용자의 경우, 원활한 종속성 환경을 통해 빌드 환경을 구성할 수 있다.
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 라이브러리를 추가해서 빌드한다고 가정하는 예이다.
우선, vcpkg로 fmt 패키지를 설치해야 한다.
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을 사용중인 개발자는 여기를 참고하면 된다.
