vcpkg는 Microsoft에서 개발한 이 도구는 원래 Visual C++
개발 환경에서 패키지 관리를 쉽게 하기 위해 만들어졌다.
그 이후로 Microsoft에서 배포하고 C++ 커뮤니티에서 유지 및 관리하는 오픈 소스 C/C++
패키지 관리자가 되었다.
또한 CMake
와 같은 다양한 빌드 시스템과 통합되어, C++
프로젝트에서 라이브러리 의존성을 관리하는 데 널리 사용되고 있다.
Python의 pip
, Node.js의 npm
, Rust의 cargo
등과 비슷한 기능을 한다. 그리고 내부적으로 라이브러리의 소스코드를 다운받아, 직접 컴파일하는 방식을 사용한다.
참고로 미리 build된 binary를 제공하지 않는 이유는 다음과 같다.
더 자세한 정보를 얻고 싶다면 이 영상(youtube)을 참고하기를 바란다.
Windows
, MacOS
, Linux
에 대한 일관된 플랫폼 간 환경을 조성할 수 있다.ABI
비호환성을 방지한다.C/C++
개발자가 이를 사용중이다.MSBuild
및 CMake
사용자의 경우, 원활한 종속성 환경을 통해 빌드 환경을 구성할 수 있다.git clone https://github.com/microsoft/vcpkg.git
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 search <package_name>
ex) vcpkg search fmt
vcpkg install <package_name>
ex) vcpkg install fmt
vcpkg remove <package_name>
ex) vcpkg remove fmt
다음은 fmt
라이브러리를 추가해서 빌드한다고 가정하는 예이다.
우선, vcpkg
로 fmt
패키지를 설치해야 한다.
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
진행중인 혹은 진행할 디렉토리로 이동 후 아래의 명령을 실행하자.
vcpkg new --application
그러면 vcpkg-configuration.json
, vcpkg.json
파일이 생성될 것이다. 그 후 fmt
패키지를 추가한다.
vcpkg add port fmt
이렇게 추가하면 vcpkg.json
파일이 다음과 같이 되어있을 것이다.
{
"dependencies": [
"fmt"
]
}
이것이 매니페스트(manifest)
파일이다. vcpkg
는 매니페스트 파일을 읽어 설치할 종속성을 알아보고, CMake
와 통합하여 프로젝트에 필요한 종속성을 제공한다.
Install and use packages with CMake
CLion
을 사용중인 개발자는 여기를 참고하면 된다.