C++ 패키지 관리 완벽 가이드 | vcpkg·Conan·시스템 패키지·프로덕션 패턴 [#55-6]
이 글의 핵심
C++ 의존성 지옥, 빌드 실패, 버전 충돌 해결. vcpkg·Conan·시스템 패키지 완전 예제, 흔한 에러, 모범 사례, 프로덕션 패턴까지 실전 코드로 다룹니다. C++에는 Python의 pip, Node.js의 npm처럼 표준 패키지 관리자가 없었습니다. 프로젝트마다 수동으로 소스 다운로드, CMake 설정, 링크 옵션을 맞추다 보면 의존성 지옥, 버전 충돌, 팀원마다 다른 빌드 결과가 발생합니다.
들어가며: “라이브러리 하나 추가하는데 하루가 걸려요"
"Boost 설치하다가 의존성 지옥에 빠졌어요”
C++에는 Python의 pip, Node.js의 npm처럼 표준 패키지 관리자가 없었습니다. 프로젝트마다 수동으로 소스 다운로드, CMake 설정, 링크 옵션을 맞추다 보면 의존성 지옥, 버전 충돌, 팀원마다 다른 빌드 결과가 발생합니다. “내 PC에서는 되는데요”는 C++ 개발자의 대표 멘트입니다.
비유하면 “창고에서 부품을 하나씩 찾아 조립하는 것”이 수동 관리라면, vcpkg·Conan은 “부품 목록만 주면 자동으로 맞는 버전을 가져와 조립해 주는 것”입니다.
flowchart LR
subgraph problem[문제 상황]
P1[의존성 지옥]
P2[버전 충돌]
P3[빌드 환경 불일치]
P4[CI 실패]
end
subgraph solution[해결 방향]
S1[vcpkg]
S2[Conan]
S3[시스템 패키지]
S4[manifest 모드]
end
P1 --> S1
P2 --> S2
P3 --> S3
P4 --> S4
이 글을 읽으면:
- vcpkg, Conan, 시스템 패키지의 완전한 사용 예제를 익힐 수 있습니다.
- 자주 발생하는 에러와 해결법을 알 수 있습니다.
- 프로덕션 환경에서의 패턴과 체크리스트를 활용할 수 있습니다.
실무 적용 경험: 이 글은 대규모 C++ 프로젝트에서 실제로 겪은 문제와 해결 과정을 바탕으로 작성되었습니다. 책이나 문서에서 다루지 않는 실전 함정과 디버깅 팁을 포함합니다.
추가 문제 시나리오
시나리오 1: 팀원마다 다른 빌드 결과
새 팀원이 git clone 후 cmake .. && make를 실행했는데 OpenSSL을 찾을 수 없습니다 에러가 납니다. 수동으로 설치한 경로가 다르고, 버전도 제각각입니다.
시나리오 2: 라이브러리 A와 B가 충돌
프로젝트에서 libA(1.2)와 libB(2.0)를 둘 다 쓰는데, libB가 내부적으로 libA(1.0)를 요구합니다. 전이 의존성 충돌로 링크 에러가 납니다.
시나리오 3: CI에서만 실패
로컬에서는 빌드가 되는데, GitHub Actions에서 vcpkg 패키지를 찾을 수 없습니다 에러가 납니다. 캐시 설정·경로 설정이 로컬과 다릅니다.
시나리오 4: 프로덕션 빌드 재현 불가
6개월 전에 빌드한 바이너리와 동일한 결과를 내려고 하는데, vcpkg/Conan이 최신 버전을 가져와 ABI가 달라져 크래시가 납니다.
시나리오 5: 헤더만 있는 라이브러리 vs 바이너리
header-only 라이브러리는 빌드 없이 include만 하면 되는데, 빌드가 필요한 라이브러리와 섞여 있어 CMake 설정이 복잡해집니다.
| 시나리오 | 특징 | 권장 도구 |
|---|---|---|
| 팀 빌드 통일 | 환경 동일화 필요 | vcpkg manifest, Conan |
| 전이 의존성 | 버전 충돌 | Conan (lockfile) |
| CI 재현성 | 캐시·버전 고정 | vcpkg baseline, Conan lockfile |
| 장기 재현성 | 6개월+ 동일 빌드 | Conan revision, vcpkg overlay |
| 헤더만 | 빌드 불필요 | vcpkg/Conan 모두 지원 |
목차
1. 패키지 관리 도구 비교
도구별 특징
| 도구 | 장점 | 단점 | 적합한 프로젝트 |
|---|---|---|---|
| vcpkg | Microsoft 지원, VS 통합, manifest 모드 | 바이너리 캐시 제한적 | Windows/VS 중심, 팀 규모 중소 |
| Conan | 버전·바이너리 캐시 강력, lockfile | 학습 곡선, 설정 복잡 | 크로스 플랫폼, CI/CD, 대규모 |
| 시스템 패키지 | OS 패키지와 통합, 재배포 용이 | 버전 고정 어려움 | Linux 서버, 배포 환경 고정 |
의사결정 흐름
flowchart TB
subgraph input[입력]
Q1[Windows 중심?]
Q2[버전 고정 필수?]
Q3[배포 환경 고정?]
end
subgraph decision[의사결정]
D1{Visual Studio?}
D2{lockfile 필요?}
D3{apt/yum 사용?}
end
subgraph result[선택]
R1[vcpkg]
R2[Conan]
R3[시스템 패키지]
end
Q1 --> D1
Q2 --> D2
Q3 --> D3
D1 -->|Yes| R1
D2 -->|Yes| R2
D3 -->|Yes| R3
2. vcpkg 완전 예제
vcpkg 설치
# 1. vcpkg 클론
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
# 2. 부트스트랩 (Windows: bootstrap-vcpkg.bat, Unix: bash)
./bootstrap-vcpkg.sh
# 3. 환경 변수 (선택)
export VCPKG_ROOT=/path/to/vcpkg
Manifest 모드 (권장)
Manifest 모드는 프로젝트 루트에 vcpkg.json을 두고, 의존성을 선언하는 방식입니다. 프로젝트가 의존성을 소유합니다.
{
"name": "my-project",
"version": "1.0.0",
"dependencies": [
"boost-asio",
"openssl",
"spdlog",
"nlohmann-json"
],
"builtin-baseline": "2024.01.25"
}
설명:
builtin-baseline: vcpkg 버전 기준일. 이 날짜의 포트로 해시가 고정되어 재현 가능한 빌드가 됩니다.dependencies: 필요한 패키지 목록. vcpkg가 자동으로 전이 의존성을 해결합니다.
CMake 연동 (Manifest 모드)
# CMakeLists.txt
cmake_minimum_required(VERSION 3.18)
project(MyProject CXX)
set(CMAKE_CXX_STANDARD 17)
# vcpkg 툴체인 파일 지정 (manifest 모드)
set(CMAKE_TOOLCHAIN_FILE "${CMAKE_CURRENT_SOURCE_DIR}/vcpkg/scripts/buildsystems/vcpkg.cmake"
CACHE STRING "VCPKG toolchain file")
# 또는 환경 변수로
# set(CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake")
find_package(PkgConfig REQUIRED)
find_package(spdlog CONFIG REQUIRED)
find_package(nlohmann_json CONFIG REQUIRED)
find_package(OpenSSL REQUIRED)
find_package(Boost REQUIRED COMPONENTS system)
add_executable(my_app main.cpp)
target_link_libraries(my_app PRIVATE
spdlog::spdlog
nlohmann_json::nlohmann_json
OpenSSL::SSL
Boost::Boost
)
vcpkg 버전 고정 (baseline)
{
"name": "my-project",
"version": "1.0.0",
"dependencies": [
{
"name": "boost-asio",
"version>=": "1.84.0"
},
{
"name": "spdlog",
"version>=": "1.12.0"
}
],
"builtin-baseline": "2024.01.25",
"overrides": [
{
"name": "openssl",
"version": "3.2.0"
}
]
}
설명:
version>=: 최소 버전 요구overrides: 전이 의존성 버전을 강제로 덮어씁니다.boost-asio가openssl1.x를 요구해도overrides로 3.2.0을 고정할 수 있습니다.
vcpkg 빌드 예제
# 프로젝트 루트에서
mkdir build && cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=../vcpkg/scripts/buildsystems/vcpkg.cmake
cmake --build .
vcpkg 오버레이 (커스텀 포트)
# CMakeLists.txt
set(VCPKG_OVERLAY_PORTS "${CMAKE_CURRENT_SOURCE_DIR}/custom-ports")
custom-ports/
my-lib/
portfile.cmake
vcpkg.json
# custom-ports/my-lib/vcpkg.json
{
"name": "my-lib",
"version": "1.0.0",
"description": "내부 라이브러리",
"homepage": "https://github.com/myorg/my-lib",
"license": "MIT",
"supports": "windows | linux | osx"
}
3. Conan 완전 예제
Conan 설치
# pip로 설치
pip install conan
# 또는 pipx (격리)
pipx install conan
# 버전 확인
conan --version
conanfile.txt (레거시 방식)
[requires]
boost/1.84.0
openssl/3.2.0
spdlog/1.12.3
nlohmann_json/3.11.3
[generators]
CMakeDeps
CMakeToolchain
[options]
boost:shared=False
openssl:shared=False
conanfile.py (권장)
from conan import ConanFile
from conan.tools.cmake import CMakeToolchain, CMakeDeps, cmake_layout
from conan.tools.scm import GitVersion
class MyProjectConan(ConanFile):
name = "my-project"
version = "1.0.0"
settings = "os", "compiler", "build_type", "arch"
generators = "CMakeDeps", "CMakeToolchain"
def layout(self):
cmake_layout(self)
def requirements(self):
self.requires("boost/1.84.0")
self.requires("openssl/3.2.0")
self.requires("spdlog/1.12.3")
self.requires("nlohmann_json/3.11.3")
def generate(self):
tc = CMakeToolchain(self)
tc.generate()
deps = CMakeDeps(self)
deps.generate()
프로젝트 구조 (Conan 2.x)
my-project/
conanfile.py
CMakeLists.txt
src/
main.cpp
Conan 설치 및 빌드
# 1. Conan 프로필 생성 (최초 1회)
conan profile detect
# 2. 의존성 설치 (conanfile.txt 사용 시)
conan install . --output-folder=build --build=missing
# 3. conanfile.py 사용 시
conan install . --output-folder=build --build=missing
# 4. CMake 빌드
cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake
cmake --build .
Conan lockfile (재현 가능 빌드)
# lockfile 생성
conan lock create .
# lockfile로 설치 (동일한 버전 보장)
conan install . --lockfile=conan.lock --output-folder=build
Conan CMakeLists.txt 연동
# CMakeLists.txt
cmake_minimum_required(VERSION 3.18)
project(MyProject CXX)
set(CMAKE_CXX_STANDARD 17)
# Conan이 생성한 파일들
find_package(spdlog CONFIG REQUIRED)
find_package(nlohmann_json CONFIG REQUIRED)
find_package(OpenSSL REQUIRED)
find_package(Boost REQUIRED COMPONENTS system)
add_executable(my_app src/main.cpp)
target_link_libraries(my_app PRIVATE
spdlog::spdlog
nlohmann_json::nlohmann_json
OpenSSL::SSL
Boost::Boost
)
Conan 옵션: 정적/동적 링크
# conanfile.py
def configure(self):
self.options[boost].shared = False
self.options[openssl].shared = False
# 설치 시 옵션 지정
conan install . -s build_type=Release -o boost:shared=False
Conan 원격 저장소
# 기본 원격 확인
conan remote list
# Conan Center (기본)
conan remote add conancenter https://center.conan.io
# 사내 저장소
conan remote add mycompany https://artifactory.mycompany.com/conan
4. 시스템 패키지 활용
apt (Ubuntu/Debian)
# 개발 패키지 설치 (헤더 + lib)
sudo apt update
sudo apt install -y libssl-dev libboost-all-dev
# CMake에서 찾기
# find_package(OpenSSL REQUIRED)
# find_package(Boost REQUIRED COMPONENTS system)
pkg-config 연동
# CMakeLists.txt
find_package(PkgConfig REQUIRED)
pkg_check_modules(OPENSSL REQUIRED openssl)
pkg_check_modules(SPDLOG REQUIRED spdlog)
target_include_directories(my_app PRIVATE ${OPENSSL_INCLUDE_DIRS})
target_link_libraries(my_app PRIVATE ${OPENSSL_LIBRARIES})
system 패키지와 vcpkg 혼용
# 시스템에 OpenSSL이 있으면 사용, 없으면 vcpkg
find_package(OpenSSL QUIET)
if(NOT OpenSSL_FOUND)
find_package(OpenSSL REQUIRED) # vcpkg에서
endif()
Dockerfile 예제 (시스템 패키지)
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y \
build-essential \
cmake \
libssl-dev \
libboost-all-dev \
libspdlog-dev \
nlohmann-json3-dev \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY . .
RUN mkdir build && cd build && cmake .. && cmake --build .
vcpkg in Docker
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y \
build-essential \
cmake \
git \
&& rm -rf /var/lib/apt/lists/*
# vcpkg 설치
RUN git clone https://github.com/Microsoft/vcpkg.git /opt/vcpkg \
&& /opt/vcpkg/bootstrap-vcpkg.sh
ENV VCPKG_ROOT=/opt/vcpkg
ENV PATH="${VCPKG_ROOT}:${PATH}"
WORKDIR /app
COPY . .
RUN mkdir build && cd build \
&& cmake .. -DCMAKE_TOOLCHAIN_FILE=${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake \
&& cmake --build .
5. 자주 발생하는 에러와 해결법
에러 1: “Could not find a package configuration file”
증상: find_package(spdlog CONFIG REQUIRED) 에러
원인: vcpkg/Conan이 설치한 패키지 경로를 CMake가 찾지 못함
# ❌ 잘못된 예 — 툴체인 파일 없이 실행
cmake ..
해결법:
# ✅ vcpkg — 툴체인 파일 지정
cmake .. -DCMAKE_TOOLCHAIN_FILE=/path/to/vcpkg/scripts/buildsystems/vcpkg.cmake
# ✅ Conan — conan install 후 CMake
conan install . --output-folder=build
cd build && cmake .. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake
에러 2: vcpkg “portfile failed”
증상: Error: vcpkg package installation failed
원인: 포트 빌드 실패, 의존성 누락, 플랫폼 미지원
# 해결 1: 빌드 로그 확인
vcpkg install spdlog --debug
# 해결 2: baseline 업데이트
# vcpkg.json의 builtin-baseline을 더 최신으로
# 해결 3: 특정 패키지 제외 후 수동 설치
# vcpkg.json에서 해당 패키지 제거, 시스템 패키지 사용
에러 3: Conan “version not found”
증상: ERROR: boost/1.99.0: not found in remote
원인: Conan Center에 해당 버전이 없음
# 해결: 사용 가능한 버전 확인
conan search boost --remote=conancenter
# 또는 conanfile.py에서 버전 수정
# self.requires("boost/1.84.0") # 존재하는 버전으로
에러 4: ABI 충돌 (mixed compiler)
증상: 링크 시 undefined reference 또는 런타임 크래시
원인: vcpkg/Conan으로 빌드한 라이브러리와 앱의 컴파일러·버전이 다름
# ❌ 위험한 조합
# vcpkg: gcc-9로 빌드
# 앱: gcc-11로 빌드
# → 링크는 되지만 std::string ABI 등 불일치
# ✅ 해결: 동일 툴체인
# vcpkg와 앱 모두 같은 gcc 버전 사용
export CXX=g++-11
export CC=gcc-11
에러 5: “cannot open shared object file” (런타임)
증상: 빌드는 성공했는데 실행 시 libfoo.so: cannot open shared object file
원인: 동적 라이브러리 경로가 없음
# 해결 1: LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/path/to/vcpkg/installed/x64-linux/lib:$LD_LIBRARY_PATH
./my_app
# 해결 2: RPATH 빌드 시 설정
# CMakeLists.txt
set(CMAKE_INSTALL_RPATH "$ORIGIN")
set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE)
# 해결 3: 정적 링크
# vcpkg: -DCMAKE_BUILD_TYPE=Release 사용 시 기본적으로 정적
# Conan: -o shared=False
에러 6: vcpkg manifest 모드에서 패키지 없음
증상: vcpkg.json을 두었는데 CMake가 패키지를 찾지 못함
원인: CMAKE_TOOLCHAIN_FILE이 vcpkg를 가리키지 않거나, vcpkg.json 경로가 잘못됨
# ✅ 올바른 설정
# vcpkg.json은 프로젝트 루트(CMakeLists.txt와 같은 위치)
# 프로젝트 루트에서 cmake -B build
# vcpkg/ 가 서브디렉터리면:
set(CMAKE_TOOLCHAIN_FILE "${CMAKE_CURRENT_SOURCE_DIR}/vcpkg/scripts/buildsystems/vcpkg.cmake"
CACHE STRING "VCPKG toolchain")
에러 7: Conan “lockfile out of date”
증상: conan.lock is out of date
원인: conanfile.py 또는 의존성 버전이 변경됨
# 해결: lockfile 재생성
conan lock create .
conan install . --lockfile=conan.lock --output-folder=build
에러 8: Windows에서 vcpkg “LINK : fatal error LNK1104”
증상: cannot open file 'libssl.lib'
원인: OpenSSL 등이 동적 링크로 빌드되었는데, 정적 링크를 시도하는 경우
# vcpkg: triplet 사용
# x64-windows-static
cmake .. -DCMAKE_TOOLCHAIN_FILE=... -DVCPKG_TARGET_TRIPLET=x64-windows-static
# vcpkg.json
"dependencies": [
{"name": "openssl", "default-features": false, "features": [crypto]}
]
에러 9: 헤더 충돌 (multiple definitions)
증상: redefinition of 'struct foo' 또는 multiple definition
원인: vcpkg/Conan 패키지와 시스템 패키지가 동시에 include됨
# ❌ 위험: 시스템 경로가 먼저
include_directories(/usr/include) # 시스템
target_link_libraries(my_app vcpkg::spdlog) # vcpkg
# ✅ 해결: vcpkg/Conan 경로만 사용
# CMAKE_TOOLCHAIN_FILE 사용 시 vcpkg 경로가 우선
# target_link_libraries에만 의존하면 include 경로는 자동
target_link_libraries(my_app PRIVATE spdlog::spdlog)
에러 10: CI에서 vcpkg 빌드 타임아웃
증상: GitHub Actions에서 vcpkg 설치가 30분 넘게 걸림
해결: 캐시
# .github/workflows/build.yml
- name: Cache vcpkg
uses: actions/cache@v4
with:
path: build/vcpkg_installed
key: vcpkg-${{ runner.os }}-${{ hashFiles('vcpkg.json') }}
- name: Configure
run: cmake -B build -DCMAKE_TOOLCHAIN_FILE=${{ github.workspace }}/vcpkg/scripts/buildsystems/vcpkg.cmake
6. 모범 사례
1. Manifest / Lockfile 사용
원칙: 의존성을 코드로 선언하고, 버전을 고정합니다.
// vcpkg.json — builtin-baseline 필수
{
"builtin-baseline": "2024.01.25",
"dependencies": [spdlog]
}
# Conan — lockfile 커밋
conan lock create .
git add conan.lock
2. 프로젝트별 격리
원칙: 전역 설치보다 프로젝트별 설치를 사용합니다.
# vcpkg: manifest 모드 (프로젝트별)
# vcpkg.json이 프로젝트에 있음
# Conan: --output-folder=build (프로젝트별)
conan install . --output-folder=build
3. CI에서 재현 가능 빌드
# vcpkg: baseline 고정
# Conan: lockfile 사용
- run: conan install . --lockfile=conan.lock --output-folder=build
4. 의존성 최소화
// ❌ 나쁜 예 — 전체 Boost
"dependencies": [boost]
// ✅ 좋은 예 — 필요한 컴포넌트만
"dependencies": ["boost-asio", "boost-system"]
5. private vs public 의존성
# 라이브러리: PRIVATE — 내부 구현만 사용
target_link_libraries(my_lib PRIVATE spdlog::spdlog)
# 인터페이스 노출 시: PUBLIC
target_link_libraries(my_lib PUBLIC nlohmann_json::nlohmann_json)
6. 헤더 전용 라이브러리
# vcpkg/Conan 모두 header-only 지원
# find_package 후 target_link_libraries만 하면 include 경로 자동
find_package(nlohmann_json CONFIG REQUIRED)
target_link_libraries(my_app PRIVATE nlohmann_json::nlohmann_json)
7. 크로스 컴파일
# vcpkg: triplet
vcpkg install spdlog --triplet=arm64-linux
# Conan: profile
conan profile new arm
conan profile update settings.os=Linux arm
conan profile update settings.arch=armv8 arm
conan install . --profile=arm
7. 프로덕션 패턴
패턴 1: vcpkg + CMake Presets
// CMakePresets.json
{
"version": 3,
"configurePresets": [
{
"name": "vcpkg",
"cacheVariables": {
"CMAKE_TOOLCHAIN_FILE": "${sourceDir}/vcpkg/scripts/buildsystems/vcpkg.cmake"
}
}
]
}
cmake --preset vcpkg
패턴 2: Conan + CMake FetchContent 대체
# CMakeLists.txt
# Conan이 의존성을 해결하므로 FetchContent 불필요
find_package(spdlog CONFIG REQUIRED)
# ...
패턴 3: 계층적 의존성 (라이브러리 → 앱)
my-project/
libs/
core/ # conanfile.py, vcpkg.json
network/ # core 의존
apps/
server/ # core, network 의존
# libs/network/conanfile.py
def requirements(self):
self.requires("core/1.0.0") # 내부 패키지
self.requires("boost/1.84.0")
패턴 4: Docker 멀티스테이지 (vcpkg)
# Stage 1: vcpkg로 의존성 빌드
FROM ubuntu:22.04 AS vcpkg
RUN apt-get update && apt-get install -y git cmake build-essential
RUN git clone https://github.com/Microsoft/vcpkg.git /vcpkg
WORKDIR /vcpkg
RUN ./bootstrap-vcpkg.sh
COPY vcpkg.json .
RUN ./vcpkg install --x-install-root=installed
# Stage 2: 앱 빌드
FROM ubuntu:22.04 AS build
COPY --from=vcpkg /vcpkg/installed /vcpkg_installed
COPY . /app
WORKDIR /app/build
RUN cmake .. -DCMAKE_TOOLCHAIN_FILE=/vcpkg_installed/scripts/buildsystems/vcpkg.cmake
RUN cmake --build .
# Stage 3: 최종 이미지
FROM ubuntu:22.04
COPY --from=build /app/build/my_app /usr/local/bin/
패턴 5: 버전 매트릭스 (CI)
# .github/workflows/build.yml
strategy:
matrix:
vcpkg_baseline: ["2024.01.25", "2024.06.20"]
compiler: [gcc-11, clang-14]
패턴 6: 빌드 시나리오 시퀀스
sequenceDiagram
participant Dev as 개발자
participant CMake as CMake
participant vcpkg as vcpkg
participant Build as 빌드
Dev->>CMake: cmake -B build
CMake->>vcpkg: vcpkg.json 읽기
vcpkg->>vcpkg: 설치/캐시 확인
vcpkg->>CMake: 툴체인 파일 제공
CMake->>CMake: find_package
CMake->>Build: 구성 완료
Dev->>Build: cmake --build
프로덕션 체크리스트
- [ ] vcpkg.json 또는 conanfile.py로 의존성 선언
- [ ] builtin-baseline 또는 conan.lock로 버전 고정
- [ ] CI에서 캐시 사용 (vcpkg_installed, Conan cache)
- [ ] 동일 툴체인으로 빌드 (컴파일러·버전)
- [ ] 정적 링크 고려 (배포 환경에 lib 없을 때)
- [ ] Dockerfile에 멀티스테이지 적용
- [ ] 의존성 업데이트 시 ABI 검증
8. 정리
| 도구 | 핵심 명령 | 버전 고정 | CI 적합 |
|---|---|---|---|
| vcpkg | vcpkg.json + manifest | builtin-baseline, overrides | ✅ |
| Conan | conanfile.py, conan install | lockfile | ✅ |
| 시스템 | apt/yum install | 패키지 버전 | 제한적 |
선택 가이드
- Windows + Visual Studio: vcpkg
- 크로스 플랫폼 + lockfile: Conan
- Linux 서버 배포: 시스템 패키지 또는 vcpkg/Conan
핵심 원칙
- 의존성을 코드로 선언 — vcpkg.json, conanfile.py
- 버전 고정 — baseline, lockfile, overrides
- 동일 툴체인 — ABI 충돌 방지
- CI 캐시 — 빌드 시간 단축
- 의존성 최소화 — 필요한 패키지만
자주 묻는 질문 (FAQ)
Q. vcpkg와 Conan을 같이 쓸 수 있나요?
A. 권장하지 않습니다. 같은 프로젝트에서 둘을 혼용하면 include 경로·라이브러리 경로가 충돌할 수 있습니다. 하나를 선택해 일관되게 사용하세요.
Q. 사내 프라이빗 라이브러리는 어떻게 하나요?
A. vcpkg: overlay-ports로 커스텀 포트 추가. Conan: 사내 Artifactory 등에 Conan 원격 저장소 추가 후 conan install 시 --remote 지정.
Q. 헤더 전용 라이브러리만 쓸 때도 vcpkg/Conan이 필요한가요?
A. 단순히 include만 하면 된다면 Git submodule이나 FetchContent로도 가능합니다. 다만 vcpkg/Conan을 쓰면 버전 관리·팀 통일이 일관됩니다.
Q. 선행으로 읽으면 좋은 글은?
A. ABI 호환성(#55-4), 동적 로딩(#55-2), 크로스 플랫폼(#55-4)을 먼저 읽으면 이해가 쉽습니다.
한 줄 요약: vcpkg·Conan·시스템 패키지로 의존성 지옥을 벗어나고, 재현 가능한 빌드를 구축할 수 있습니다.
참고 자료
관련 글
- C++ vcpkg 기초 완벽 가이드 | 설치·Manifest·Triplet·버전·커스텀 포트 [#53-3]
- C++ Conan 기초 완벽 가이드 | 설치·conanfile·프로필·CMake 연동 [#53-4]
- C++ Conan 완벽 가이드 | 현대적인 C++ 패키지 관리