C++ 패키지 관리 완벽 가이드 | vcpkg·Conan·시스템 패키지·프로덕션 패턴 [#55-6]

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 clonecmake .. && 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. 패키지 관리 도구 비교
  2. vcpkg 완전 예제
  3. Conan 완전 예제
  4. 시스템 패키지 활용
  5. 자주 발생하는 에러와 해결법
  6. 모범 사례
  7. 프로덕션 패턴
  8. 정리

1. 패키지 관리 도구 비교

도구별 특징

도구장점단점적합한 프로젝트
vcpkgMicrosoft 지원, 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-asioopenssl 1.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

증상: 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 적합
vcpkgvcpkg.json + manifestbuiltin-baseline, overrides
Conanconanfile.py, conan installlockfile
시스템apt/yum install패키지 버전제한적

선택 가이드

  • Windows + Visual Studio: vcpkg
  • 크로스 플랫폼 + lockfile: Conan
  • Linux 서버 배포: 시스템 패키지 또는 vcpkg/Conan

핵심 원칙

  1. 의존성을 코드로 선언 — vcpkg.json, conanfile.py
  2. 버전 고정 — baseline, lockfile, overrides
  3. 동일 툴체인 — ABI 충돌 방지
  4. CI 캐시 — 빌드 시간 단축
  5. 의존성 최소화 — 필요한 패키지만

자주 묻는 질문 (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++ 패키지 관리
... 996 lines not shown ... Token usage: 63706/1000000; 936294 remaining Start-Sleep -Seconds 3