vcpkg는 Microsoft에서 제공하는 C/C++ 패키지 관리자이다.
Python의 pip, Node.js의 npm과 같이, C/C++ 환경에서 용이하게 패키지를 설치/삭제할 때 사용한다.
간혹 윈도우 환경에서 C/C++로 개발하는 중 필요한 라이브러리가 생길 시, 공식 홈페이지에 들어가서... 압축 파일을 다운받아서... 경로를 어쩌고... 했는데 안되고...
이런 복잡하고 괴로운 과정을 한 번쯤 겪어봤을 것이다.
이를 해결하기 위해 vcpkg를 사용한다.
아래 공식 Github 링크에 들어간다.
https://github.com/microsoft/vcpkg
가운데 초록색 Code 버튼을 누르고 아래 Download/ZIP 버튼을 누른다.
그러면 zip 파일이 다운로드된다. 압축을 풀고 폴더 안에서 명령 프롬프트를 열어 아래 명령어를 실행한다.
.\bootstrap-vcpkg.bat
그럼 아래와 같이 설치된다.
압축 해제한 폴더를 환경 변수에 등록해야 하는데, 원하는 위치가 있다면 폴더를 해당 위치로 이동시킨다.
필자는 현재 바탕 화면에 vcpkg-master 라는 이름으로 되어있는데, C:\ 밑에 vcpkg 라는 이름으로 옮겼다고 해보자.
그럼 위치된 경로는 아래와 같다.
C:\vcpkg
이 경로를 내 PC 우클릭 > 속성 > 고급 시스템 설정 > 고급 > 환경 변수 에 들어가서 시스템 환경 변수에 등록한다.
그리고 명령 프롬프트를 실행하여 아래 명령어 입력 시 정상 동작하는지 확인한다.
vcpkg --version
위와 같이 버전이 정상적으로 출력된다면, 아래의 명령어를 입력하여 vcpkg의 위치를 전역 경로로 등록해준다.
vcpkg integrate install
그러면 아래와 같이 출력되는데,
CMake projects should use: "-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake"
이는 vcpkg toolchain 파일 경로가 위와 같이 설정되었기 때문에, CMake 프로젝트에서 vcpkg 패키지를 불러다 쓰려면 빌드 시 위의 내용이 들어가야 한다는 뜻이다.
vcpkg 패키지 설치/삭제/조회 명령어는 아래와 같다.
vcpkg install [패키지명]
vcpkg remove [패키지명]
vcpkg list
curl이 필요하여 설치한다고 가정해보자. 아래의 명령어를 입력한다.
vcpkg install curl
그러면 아래와 같이 현재 플랫폼에 맞는 패키지가 설치되는 것을 볼 수 있다.
반대로 패키지를 잘못 설치했거나 불필요해졌을 때, 아래의 명령어를 입력한다.
vcpkg remove curl
그러면 아래와 같이 삭제되는 것을 볼 수 있다.
현재 vcpkg에 설치된 패키지 목록을 보려면 아래의 명령어를 입력한다.
vcpkg list
그러면 아래와 같이 설치된 패키지 목록을 볼 수 있다.
vcpkg로 설치한 패키지를 VSCode에서 사용해보자.
보통 CMake를 사용하여 빌드 시스템을 구성하는 게 일반적이라고 한다. 따라서 프로젝트 내에 CMakeLists.txt를 만들어 설정하여야 한다.
필요한지 잘 모르겠는데, 두 개 설치해준다.
C/C++은 아래와 같다.
CMake Tools는 아래와 같다.
먼저 임의의 폴더를 만들고 VSCode에서 불러오자.
예) test-vcpkg
mkdir test-vcpkg
cd test-vcpkg
예제 코드를 작성한다. curl를 통해 https를 요청하고 응답받는 코드이다.
#include <curl/curl.h> // This will be imported from vcpkg.
#include <iostream>
int main(void) {
CURL* curl;
CURLcode res;
// Initialize curl
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
// Check if curl was initialized correctly
if (!curl) {
std::cerr << "curl_easy_init() failed" << std::endl;
curl_global_cleanup();
return 1;
}
// Set the URL to send the request to
curl_easy_setopt(curl, CURLOPT_URL, "https://www.google.com");
// Perform the request
res = curl_easy_perform(curl);
std::cout << std::endl;
// Check if the request was successful
if (res != CURLE_OK) {
std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;
} else {
std::cout << "HTTPS request succeeded" << std::endl;
}
// Clean up
curl_easy_cleanup(curl);
curl_global_cleanup();
return 0;
}
이어서 프로젝트 폴더 내에 CMakeLists.txt 파일을 만든다.
파일 안에서 vcpkg 툴체인 설정, curl 패키지 조회, 라이브러리 링크를 해준다.
cmake_minimum_required(VERSION 3.10)
project(test-vcpkg)
# Set the path to the vcpkg toolchain file
set(CMAKE_TOOLCHAIN_FILE "C:/vcpkg/scripts/buildsystems/vcpkg.cmake" CACHE STRING "Vcpkg toolchain file")
# Set C++ standard
set(CMAKE_CXX_STANDARD 17)
# Find the package
find_package(curl CONFIG REQUIRED)
# Add the executable
add_executable(test-vcpkg main.cpp)
# Link the libraries
target_link_libraries(test-vcpkg PRIVATE CURL::libcurl)
마지막으로 CMake에서 사용할 빌드 시스템을 지정해주어야 하는데, 프로젝트 내에 .vscode 폴더를 생성하고, 그 안에 settings.json 파일을 생성하여 아래 내용을 입력한다.
{
"cmake.configureSettings": {
"CMAKE_TOOLCHAIN_FILE": "C:/vcpkg/scripts/buildsystems/vcpkg.cmake"
},
"cmake.generator": "Visual Studio 17 2022", // MSBuild
"files.associations": {
"ostream": "cpp"
}
}
필자는 PC에 빌드 시스템으로 Visual Studio Build Tools
가 설치되어 있어 cmake.generator
에 위 내용을 입력했으나, 각자의 환경에 따라 Ninja
, MinGW Makefiles
등 원하는 빌드 시스템을 입력하면 된다.
프로젝트 구성을 제대로 했다면 아래와 같은 모습일 것이다.
VSCode 창에서 Ctrl + Shift + P
를 입력한 후 cmake configuration
이라고 입력 후 엔터를 눌러 실행한다.
cmake configuration
실행하면 아래와 같이 정상적으로 configuration 된 것을 볼 수 있다.
이어서 Ctrl + Shift + P
를 입력한 후 cmake build
를 입력하여 프로젝트를 빌드한다.
cmake build
그러면 프로젝트가 정상적으로 빌드되는 것을 볼 수 있다.
빌드된 코드를 실행하기 위해 Ctrl + Shift + P
를 입력 후 cmake run
을 실행한다.
cmake run
그러면 아래와 같이 https 요청에 대한 응답이 오면서 HTTPS request succeeded
가 출력된다.
이는 vcpkg로 설치한 curl 라이브러리가 vscode 내 프로젝트에서 정상적으로 링크되어 사용되었다는 뜻이다.
대략 이렇게 사용하면 될 것 같다.
Python pip가 패키지 설치 후 소스에서 import만 해오면 되는 것에 비해, vcpkg는 CMakeLists.txt에 find_package
와 target_link_libraries
도 같이 추가해줘야 하기 때문에 조금 더 번거로울 수는 있지만, 직접 써보니 막 그렇게 불편하지도 않은 것 같다. 또 사용하다 보면 익숙해질 것 같다.