Ver3.0 ๐ C++ ํจํค์ง ๊ด๋ฆฌ์ ์๋ก์ด ์๋: Conan๊ณผ vcpkg๋ก ์์กด์ฑ ๊ด๋ฆฌ ์๋ฒฝ ์ ๋ณตํ๊ธฐ

๐ C++ ํจํค์ง ๊ด๋ฆฌ์ ์๋ก์ด ์๋: Conan๊ณผ vcpkg๋ก ์์กด์ฑ ๊ด๋ฆฌ ์๋ฒฝ ์ ๋ณตํ๊ธฐ
ํ๋์ ์ธ C++ ๊ฐ๋ฐ์ ์ํ ํ์ ๋๊ตฌ๋ค์ ์น๊ตฌ์ฒ๋ผ ์ฝ๊ฒ ์๋ ค๋๋ฆฝ๋๋ค!
๐ ์๋
! C++ ๊ฐ๋ฐํ๋ฉด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น ๋๋ฌธ์ ๋จธ๋ฆฌ ์ํ ๋ ๊ฒฝํ ์์ง? ํค๋ ํ์ผ ์ฐพ์์ ๋ณต์ฌํ๊ณ , ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฒฝ๋ก ์ค์ ํ๊ณ , ๋ฒ์ ์ถฉ๋๋ก ๋ฐค์ ๋๋ฒ๊น
ํ๊ณ ... ์ ๋ง ๋์ฐํ์ง ์์?
์ค๋์ ๊ทธ๋ฐ ๊ณ ๋ฏผ์ ํ ๋ฐฉ์ ๋ ๋ ค์ค Conan๊ณผ vcpkg๋ผ๋ ๋ ๊ฐ์ง ๊ฐ๋ ฅํ ํจํค์ง ๊ด๋ฆฌ ๋๊ตฌ๋ฅผ ์๊ฐํ ๊ฒ! ์ด ์น๊ตฌ๋ค์ ์๊ณ ๋๋ฉด C++ ๊ฐ๋ฐ์ด ์ ๋ง ํธํด์ง๋ค๊ณ ์ฅ๋ดํ ์ ์์ด. ๐
์ฌ๋ฅ๋ท์์๋ ๋ง์ ๊ฐ๋ฐ์๋ค์ด ์ด๋ฐ ํ๋์ ์ธ ๋๊ตฌ ํ์ฉ๋ฒ์ ๊ณต์ ํ๊ณ ์๋๋ฐ, ์ค๋ ์ด ๊ธ์ ํตํด ๋๋ C++ ํจํค์ง ๊ด๋ฆฌ์ ๋ฌ์ธ์ด ๋ ์ ์์ ๊ฑฐ์ผ!
๐ค ์ C++์๋ ํจํค์ง ๊ด๋ฆฌ์๊ฐ ํ์ํ ๊น?
๋ค๋ฅธ ์ธ์ด๋ค์ ๋ณด๋ฉด ์ ๋ง ๋ถ๋ฝ์ง ์์? Python์๋ pip๊ฐ ์๊ณ , JavaScript์๋ npm์ด ์๊ณ , Rust์๋ cargo๊ฐ ์์์. ๊ทธ๋ฐ๋ฐ C++๋... ์, ์ญ์ฌ๊ฐ ์ค๋๋ ๋งํผ ๋ณต์กํ ์ฌ์ฐ์ด ์์ด. ๐
C++๋ 1980๋
๋๋ถํฐ ์ฌ์ฉ๋์ด ์จ ์ธ์ด๋ผ์, ํจํค์ง ๊ด๋ฆฌ๋ผ๋ ๊ฐ๋
์ด ์๊ธฐ๊ธฐ ์ ๋ถํฐ ์กด์ฌํ์ด. ๊ทธ๋์ ์ ํต์ ์ผ๋ก๋ ์ด๋ฐ ์์ผ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ์ง:
๐ฐ ์ ํต์ ์ธ C++ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ด๋ฆฌ์ ๊ณ ํต
1. ์๋ ๋ค์ด๋ก๋
๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ณต์ ์น์ฌ์ดํธ์ ๊ฐ์ ์์ค์ฝ๋๋ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ค์ด๋ก๋ํด์ผ ํ์ด. ๋ฒ์ ๋ ์ง์ ํ์ธํ๊ณ ๋ง์ด์ผ.
2. ๋น๋ ์ค์ ์ง์ฅ
CMakeLists.txt๋ Makefile์ include ๊ฒฝ๋ก, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฒฝ๋ก๋ฅผ ์ผ์ผ์ด ์ถ๊ฐํด์ผ ํ์ง. ๊ฒฝ๋ก ํ๋ ํ๋ฆฌ๋ฉด? ์ปดํ์ผ ์๋ฌ์ ํฅ์ฐ! ๐ฅ
3. ๋ฒ์ ์ถฉ๋
ํ๋ก์ ํธ A๋ Boost 1.70์ด ํ์ํ๋ฐ, ํ๋ก์ ํธ B๋ Boost 1.75๊ฐ ํ์ํ๋ฉด? ์์คํ
์ ๋ ๋ฒ์ ์ ๋์์ ๊ด๋ฆฌํ๋ ๊ฑด ์ ๋ง ์
๋ชฝ์ด์์ด.
4. ํ๋ซํผ ์์กด์ฑ
Windows์์ ์ ๋์๊ฐ๋ ํ๋ก์ ํธ๋ฅผ Linux๋ก ์ฎ๊ธฐ๋ฉด? ๋ชจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ค์ ์ค์ ํด์ผ ํ์ด. ๐ญ
์ด๋ฐ ๋ฌธ์ ๋ค ๋๋ฌธ์ C++ ์ปค๋ฎค๋ํฐ์์๋ ์ค๋ซ๋์ "ํ์ค ํจํค์ง ๊ด๋ฆฌ์"๋ฅผ ์ํ์ด. ๊ทธ๋ฆฌ๊ณ ๋๋์ด 2010๋ ๋ ์ค๋ฐ๋ถํฐ ๋ณธ๊ฒฉ์ ์ธ ํด๊ฒฐ์ฑ ๋ค์ด ๋ฑ์ฅํ๊ธฐ ์์ํ์ง!
๐ฏ Conan: ํ์ด์ฌ ๊ธฐ๋ฐ์ ๊ฐ๋ ฅํ ํจํค์ง ๊ด๋ฆฌ์
Conan์ 2016๋ ์ JFrog๋ผ๋ ํ์ฌ์์ ๋ง๋ C/C++ ํจํค์ง ๊ด๋ฆฌ์์ผ. ํ์ด์ฌ์ผ๋ก ์์ฑ๋์ด ์์ด์ ์ค์น๋ ์ฝ๊ณ , ํฌ๋ก์ค ํ๋ซํผ์ ์๋ฒฝํ๊ฒ ์ง์ํด. ๐
Conan์ "๋ฐ์ด๋๋ฆฌ ํจํค์ง ๊ด๋ฆฌ"์ ์ง์คํด. ์ฆ, ์์ค์ฝ๋๋ฅผ ๋งค๋ฒ ์ปดํ์ผํ๋ ๊ฒ ์๋๋ผ, ๋ฏธ๋ฆฌ ๋น๋๋ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ค์ด๋ก๋ํด์ ์ฌ์ฉํ ์ ์์ด. ์ด๊ฒ ์์ฒญ๋ ์๊ฐ ์ ์ฝ์ด์ง!
โ๏ธ Conan ์ค์นํ๊ธฐ
Conan ์ค์น๋ ์ ๋ง ๊ฐ๋จํด. Python์ด ์ค์น๋์ด ์๋ค๋ฉด pip๋ก ํ ์ค์ด๋ฉด ๋์ด์ผ:
pip install conan
์ค์น๊ฐ ์๋ฃ๋๋ฉด ๋ฒ์ ์ ํ์ธํด๋ณด์:
conan --version
Conan 2.0 ์ด์์ด ์ค์น๋์๋ค๋ฉด ์ค๋น ์๋ฃ! โ
๐ฆ Conan์ผ๋ก ์ฒซ ๋ฒ์งธ ํจํค์ง ์ค์นํ๊ธฐ
์ค์ ์์ ๋ก ๋ฐฐ์ฐ๋ ๊ฒ ์ ์ผ ๋น ๋ฅด์ง? ์ ๋ช ํ JSON ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ nlohmann_json์ ์ค์นํด๋ณผ๊ฒ.
ํ๋ก์ ํธ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์
conanfile.txt ํ์ผ์ ๋ง๋ค์ด:
[requires]
nlohmann_json/3.11.2
[generators]
CMakeDeps
CMakeToolchain
[options]
[imports]
์ด ํ์ผ์ด ๋ญ ์๋ฏธํ๋์ง ํ๋์ฉ ๋ฏ์ด๋ณผ๊น? ๐
[requires]: ํ์ํ ํจํค์ง์ ๋ฒ์ ์ ๋ช
์ํด. ์ฌ๊ธฐ์๋ nlohmann_json ๋ฒ์ 3.11.2๋ฅผ ์์ฒญํ์ด.
[generators]: CMake์ ํตํฉํ๊ธฐ ์ํ ํ์ผ๋ค์ ์๋์ผ๋ก ์์ฑํด์ค. CMakeDeps๋ ์์กด์ฑ ์ ๋ณด๋ฅผ, CMakeToolchain์ ๋น๋ ์ค์ ์ ๋ง๋ค์ด์ค.
[options]: ํจํค์ง๋ณ ๋น๋ ์ต์
์ ์ค์ ํ ์ ์์ด. ์ง๊ธ์ ๋น์๋์ง๋ง, ๋์ค์ ํ์ํ๋ฉด ์ถ๊ฐํ ์ ์์ด.
[imports]: ํน์ ํ์ผ๋ค์ ํ๋ก์ ํธ๋ก ๋ณต์ฌํ๊ณ ์ถ์ ๋ ์ฌ์ฉํด.
์ด์ ์ค์ ๋ก ํจํค์ง๋ฅผ ์ค์นํด๋ณด์:
mkdir build
cd build
conan install .. --build=missing
--build=missing ์ต์
์ ๋ฏธ๋ฆฌ ๋น๋๋ ๋ฐ์ด๋๋ฆฌ๊ฐ ์์ผ๋ฉด ์์ค์์ ์ง์ ๋น๋ํ๋ผ๋ ์๋ฏธ์ผ. ์ฒ์์๋ ์๊ฐ์ด ์ข ๊ฑธ๋ฆด ์ ์์ด. โฐ
์ด์ CMake ์ค์ ํ์ผ์ ๋ง๋ค์ด๋ณด์:
cmake_minimum_required(VERSION 3.15)
project(MyProject)
set(CMAKE_CXX_STANDARD 17)
# Conan์ด ์์ฑํ ํ์ผ๋ค์ ์ฐพ์
find_package(nlohmann_json REQUIRED)
add_executable(main main.cpp)
target_link_libraries(main nlohmann_json::nlohmann_json)
๊ฐ๋จํ ์์ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์ (main.cpp):
#include <nlohmann/json.hpp>
#include <iostream>
using json = nlohmann::json;
int main() {
json j;
j["name"] = "Conan";
j["type"] = "Package Manager";
j["awesome"] = true;
std::cout << j.dump(4) << std::endl;
return 0;
}
์ด์ ๋น๋ํด๋ณด์:
cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake
cmake --build .
์คํํ๋ฉด ์์๊ฒ ํฌ๋งท๋ JSON์ด ์ถ๋ ฅ๋ ๊ฑฐ์ผ! ๐
๐ง Conan์ ๊ณ ๊ธ ๊ธฐ๋ฅ๋ค
1. ํ๋กํ์ผ ๊ด๋ฆฌ
Conan์ "ํ๋กํ์ผ"์ด๋ผ๋ ๊ฐ๋ ์ผ๋ก ๋ค์ํ ๋น๋ ์ค์ ์ ๊ด๋ฆฌํด. ์๋ฅผ ๋ค์ด, Debug์ฉ ํ๋กํ์ผ๊ณผ Release์ฉ ํ๋กํ์ผ์ ๋ฐ๋ก ๋ง๋ค ์ ์์ด:
# Debug ํ๋กํ์ผ ์์ฑ
conan profile detect --force
# ํ๋กํ์ผ ํ์ธ
conan profile show default
ํ๋กํ์ผ ํ์ผ์ ์ง์ ์์ ํด์ ์ปดํ์ผ๋ฌ, ๋น๋ ํ์ , ์ํคํ ์ฒ ๋ฑ์ ์ธ๋ฐํ๊ฒ ์กฐ์ ํ ์ ์์ด.
2. ์๊ฒฉ ์ ์ฅ์ ๊ด๋ฆฌ
Conan์ ๊ธฐ๋ณธ์ ์ผ๋ก ConanCenter๋ผ๋ ๊ณต์ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ์ง๋ง, ํ์ฌ ๋ด๋ถ ์ ์ฅ์๋ ๊ฐ์ธ ์ ์ฅ์๋ ์ถ๊ฐํ ์ ์์ด:
# ์๊ฒฉ ์ ์ฅ์ ๋ชฉ๋ก ํ์ธ
conan remote list
# ์ ์ ์ฅ์ ์ถ๊ฐ
conan remote add my-repo https://my-company.com/artifactory/api/conan/conan-local
์ด๊ฑด ํ ํ๋ก์ ํธ์์ ์์ฒญ ์ ์ฉํด! ํ์ฌ ๋ด๋ถ์์๋ง ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ณต์ ํ ์ ์๊ฑฐ๋ . ๐ข
3. conanfile.py๋ก ๋ ๊ฐ๋ ฅํ๊ฒ
conanfile.txt๋ ๊ฐ๋จํ์ง๋ง ์ ํ์ ์ด์ผ. ๋ ๋ณต์กํ ์ค์ ์ด ํ์ํ๋ฉด conanfile.py๋ฅผ ์ฌ์ฉํ ์ ์์ด:
from conan import ConanFile
from conan.tools.cmake import CMake, cmake_layout
class MyProjectConan(ConanFile):
name = "myproject"
version = "1.0"
settings = "os", "compiler", "build_type", "arch"
def requirements(self):
self.requires("nlohmann_json/3.11.2")
self.requires("fmt/9.1.0")
def build_requirements(self):
self.tool_requires("cmake/3.25.0")
def layout(self):
cmake_layout(self)
def build(self):
cmake = CMake(self)
cmake.configure()
cmake.build()
Python ์ฝ๋๋ก ์์ฑํ๋๊น ์กฐ๊ฑด๋ฌธ, ๋ฐ๋ณต๋ฌธ ๋ฑ์ ์์ ๋กญ๊ฒ ์ฌ์ฉํ ์ ์์ด. ์ ๋ง ๊ฐ๋ ฅํ์ง? ๐ช
๐ช vcpkg: Microsoft๊ฐ ๋ง๋ ํฌ๋ก์ค ํ๋ซํผ ํจํค์ง ๊ด๋ฆฌ์
vcpkg๋ Microsoft๊ฐ 2016๋ ์ ์คํ์์ค๋ก ๊ณต๊ฐํ C++ ํจํค์ง ๊ด๋ฆฌ์์ผ. ์ฒ์์๋ Windows ์ ์ฉ์ผ๋ก ์์ํ์ง๋ง, ์ง๊ธ์ Linux์ macOS๋ ์๋ฒฝํ๊ฒ ์ง์ํด. ๐
vcpkg๋ "์์ค ๊ธฐ๋ฐ ๋น๋"๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ํด. ์ฆ, ํจํค์ง๋ฅผ ์ค์นํ ๋ ์์ค์ฝ๋๋ฅผ ๋ค์ด๋ก๋ํด์ ํ์ฌ ์์คํ ์ ๋ง๊ฒ ์ปดํ์ผํด. ์ด๊ฒ ์ข ๋๋ฆด ์๋ ์์ง๋ง, ํธํ์ฑ ๋ฌธ์ ๊ฐ ๊ฑฐ์ ์์ด!
โ๏ธ vcpkg ์ค์นํ๊ธฐ
vcpkg ์ค์น๋ Git ์ ์ฅ์๋ฅผ ํด๋ก ํ๋ ๊ฒ๋ถํฐ ์์ํด:
git clone https://github.com/microsoft/vcpkg.git
cd vcpkg
.\bootstrap-vcpkg.bat
git clone https://github.com/microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
๋ถํธ์คํธ๋ฉ์ด ์๋ฃ๋๋ฉด vcpkg ์คํ ํ์ผ์ด ์์ฑ๋ผ. ์ด์ ํ๊ฒฝ ๋ณ์์ ์ถ๊ฐํ๋ฉด ์ด๋์๋ ์ฌ์ฉํ ์ ์์ด:
setx VCPKG_ROOT "C:\path\to\vcpkg"
setx PATH "%PATH%;%VCPKG_ROOT%"
export VCPKG_ROOT=/path/to/vcpkg
export PATH=$VCPKG_ROOT:$PATH
๐ฆ vcpkg๋ก ํจํค์ง ์ค์นํ๊ธฐ
vcpkg์ ์ฌ์ฉ๋ฒ์ ์ ๋ง ์ง๊ด์ ์ด์ผ. ํจํค์ง๋ฅผ ๊ฒ์ํ๊ณ ์ค์นํ๋ ๊ฒ ํ ์ค์ด๋ฉด ๋๋๊ฑฐ๋ !
๋จผ์ ์ด๋ค ํจํค์ง๋ค์ด ์๋์ง ๊ฒ์ํด๋ณด์:
vcpkg search json
์ด๋ ๊ฒ ํ๋ฉด "json"์ด ํฌํจ๋ ๋ชจ๋ ํจํค์ง๊ฐ ๋์. nlohmann-json, jsoncpp, rapidjson ๋ฑ๋ฑ ๋ง์ ์ต์ ์ด ์์ด. ๐
์ํ๋ ํจํค์ง๋ฅผ ์ฐพ์์ผ๋ฉด ์ค์นํด๋ณด์:
vcpkg install nlohmann-json
์ด ๋ช ๋ น์ด ํ๋๋ก ๋์ด์ผ! vcpkg๊ฐ ์์์ ์์ค๋ฅผ ๋ค์ด๋ก๋ํ๊ณ , ์ปดํ์ผํ๊ณ , ์ค์นํด์ค. ์ฒ์์๋ ์๊ฐ์ด ์ข ๊ฑธ๋ฆด ์ ์์ด. โ
vcpkg๋ ๊ธฐ๋ณธ์ ์ผ๋ก x86 ์ํคํ ์ฒ์ฉ์ผ๋ก ๋น๋ํด. x64๊ฐ ํ์ํ๋ฉด
vcpkg install nlohmann-json:x64-windows์ฒ๋ผ ํธ๋ฆฌํ๋ ์ ๋ช
์ํด์ค์ผ ํด!
vcpkg๋ฅผ Visual Studio์ ํตํฉํ๋ ค๋ฉด:
vcpkg integrate install
์ด ๋ช
๋ น์ด๋ฅผ ์คํํ๋ฉด Visual Studio๊ฐ ์๋์ผ๋ก vcpkg์ ์ค์น๋ ํจํค์ง๋ค์ ์ธ์ํด. ๋ณ๋์ ์ค์ ์์ด ๋ฐ๋ก #include๋ก ์ฌ์ฉํ ์ ์์ด! ๐ฏ
CMake๋ฅผ ์ฌ์ฉํ๋ค๋ฉด toolchain ํ์ผ์ ์ง์ ํด์ค:
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=[vcpkg root]/scripts/buildsystems/vcpkg.cmake
cmake --build build
๐ vcpkg.json์ผ๋ก ์์กด์ฑ ๊ด๋ฆฌํ๊ธฐ
vcpkg๋ Conan์ฒ๋ผ ๋งค๋ํ์คํธ ํ์ผ์ ์ง์ํด. vcpkg.json์ด๋ผ๋ ํ์ผ๋ก ํ๋ก์ ํธ์ ์์กด์ฑ์ ์ ์ธํ ์ ์์ด:
{
"name": "my-awesome-project",
"version": "1.0.0",
"dependencies": [
"nlohmann-json",
"fmt",
"spdlog"
],
"builtin-baseline": "2023.11.20"
}
์ด ํ์ผ์ ํ๋ก์ ํธ ๋ฃจํธ์ ๋๊ณ CMake๋ฅผ ์คํํ๋ฉด, vcpkg๊ฐ ์๋์ผ๋ก ํ์ํ ํจํค์ง๋ค์ ์ค์นํด์ค. ํ์๋ค๊ณผ ๊ณต์ ํ ๋ ์์ฒญ ํธ๋ฆฌํ์ง! ๐ฅ
builtin-baseline์ด ๋ญ์ผ?
builtin-baseline์ vcpkg ์ ์ฅ์์ ํน์ ์ปค๋ฐ์ ๊ฐ๋ฆฌ์ผ. ์ด๊ฑธ ๋ช
์ํ๋ฉด ๋ชจ๋ ํ์์ด ๋์ผํ ๋ฒ์ ์ ํจํค์ง๋ฅผ ์ฌ์ฉํ๊ฒ ๋ผ. ๋ฒ์ ๋ถ์ผ์น๋ก ์ธํ ๋ฌธ์ ๋ฅผ ์๋ฐฉํ ์ ์์ด!
์ต์ baseline์ ํ์ธํ๋ ค๋ฉด vcpkg GitHub ์ ์ฅ์์ ์ปค๋ฐ ํ์คํ ๋ฆฌ๋ฅผ ํ์ธํ๋ฉด ๋ผ.
๐ง vcpkg์ ๊ณ ๊ธ ๊ธฐ๋ฅ๋ค
1. ํธ๋ฆฌํ๋ (Triplet) ์์คํ
vcpkg๋ "ํธ๋ฆฌํ๋ "์ด๋ผ๋ ๊ฐ๋ ์ผ๋ก ๋น๋ ํ๊ฒ์ ๊ด๋ฆฌํด. ํธ๋ฆฌํ๋ ์ ํ๋ซํผ, ์ํคํ ์ฒ, ๋งํน ๋ฐฉ์์ ์กฐํฉํ ๊ฑฐ์ผ:
# Windows 64๋นํธ, ๋์ ๋งํน
vcpkg install boost:x64-windows
# Windows 64๋นํธ, ์ ์ ๋งํน
vcpkg install boost:x64-windows-static
# Linux 64๋นํธ
vcpkg install boost:x64-linux
# macOS ARM64
vcpkg install boost:arm64-osx
์ปค์คํ
ํธ๋ฆฌํ๋ ๋ ๋ง๋ค ์ ์์ด. triplets/ ๋๋ ํ ๋ฆฌ์ ์ ํ์ผ์ ๋ง๋ค๋ฉด ๋ผ! ๐จ
2. ๋ฐ์ด๋๋ฆฌ ์บ์ฑ
vcpkg๋ ์์ค ๊ธฐ๋ฐ์ด๋ผ ๋น๋ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆด ์ ์์ด. ํ์ง๋ง ๋ฐ์ด๋๋ฆฌ ์บ์ฑ์ ํ์ฑํํ๋ฉด ํ ๋ฒ ๋น๋ํ ํจํค์ง๋ฅผ ์ฌ์ฌ์ฉํ ์ ์์ด:
# ๋ก์ปฌ ํ์ผ ์์คํ
์บ์
vcpkg install boost --binarysource=clear;files,C:\vcpkg-cache,readwrite
# Azure Blob Storage ์บ์ (ํ ๊ณต์ ์ฉ)
vcpkg install boost --binarysource=clear;x-azblob,https://account.blob.core.windows.net/container,sas-token
ํ ํ๋ก์ ํธ์์ Azure๋ AWS S3 ๊ฐ์ ํด๋ผ์ฐ๋ ์คํ ๋ฆฌ์ง๋ฅผ ์บ์๋ก ์ฌ์ฉํ๋ฉด, ๋ชจ๋ ํ์์ด ๋น๋ ์๊ฐ์ ํฌ๊ฒ ๋จ์ถํ ์ ์์ด! โก
3. ์ค๋ฒ๋ ์ด ํฌํธ
๊ณต์ vcpkg ์ ์ฅ์์ ์๋ ํจํค์ง๋, ๊ธฐ์กด ํจํค์ง๋ฅผ ์์ ํ๊ณ ์ถ์ ๋ "์ค๋ฒ๋ ์ด ํฌํธ"๋ฅผ ์ฌ์ฉํ ์ ์์ด:
# ์ปค์คํ
ํฌํธ ๋๋ ํ ๋ฆฌ ์์ฑ
mkdir my-ports
mkdir my-ports/my-custom-lib
# portfile.cmake ์์ฑ
# (ํจํค์ง ๋น๋ ๋ฐฉ๋ฒ ์ ์)
# ์ค๋ฒ๋ ์ด ํฌํธ๋ก ์ค์น
vcpkg install my-custom-lib --overlay-ports=./my-ports
์ด ๊ธฐ๋ฅ์ ํ์ฌ ๋ด๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ ๋ ์ ๋ง ์ ์ฉํด!
โ๏ธ Conan vs vcpkg: ์ด๋ค ๊ฑธ ์ ํํด์ผ ํ ๊น?
์, ์ด์ ๋ ๋๊ตฌ๋ฅผ ๋ชจ๋ ์ดํด๋ดค์ผ๋ ๊ฐ์ฅ ์ค์ํ ์ง๋ฌธ์ด ๋จ์์ด. "๋๋ ์ด๋ค ๊ฑธ ์จ์ผ ํ์ง?" ๐คท
์ ๋ต์... ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅด๋ค๋ ๊ฑฐ์ผ! ๊ฐ๊ฐ ์ฅ๋จ์ ์ด ์๊ฑฐ๋ . ํ๋์ฉ ๋น๊ตํด๋ณผ๊ฒ.
| ๋น๊ต ํญ๋ชฉ | Conan | vcpkg |
|---|---|---|
| ์ค์น ๋์ด๋ | ์ฌ์ (pip ํ ์ค) | ๋ณดํต (Git ํด๋ก ํ์) |
| ๋น๋ ์๋ | ๋น ๋ฆ (๋ฐ์ด๋๋ฆฌ ๋ค์ด๋ก๋) | ๋๋ฆผ (์์ค ์ปดํ์ผ) |
| ํธํ์ฑ | ๋ฐ์ด๋๋ฆฌ ํธํ์ฑ ์ด์ ๊ฐ๋ฅ | ๋งค์ฐ ๋์ (ํ์ฌ ํ๊ฒฝ์ ๋ง์ถค) |
| ํจํค์ง ์ | 1,000๊ฐ ์ด์ | 2,000๊ฐ ์ด์ |
| ํ์ต ๊ณก์ | ์ค๊ฐ (ํ๋กํ์ผ ๊ฐ๋ ) | ๋ฎ์ (์ง๊ด์ ) |
| ์ปค์คํฐ๋ง์ด์ง | ๋งค์ฐ ์ ์ฐํจ | ์ ์ฐํจ |
| IDE ํตํฉ | CMake ํตํฉ | Visual Studio ๋ค์ดํฐ๋ธ ์ง์ |
| ๊ธฐ์ ์ง์ | JFrog Artifactory | Azure Artifacts |
โ Conan์ ์ ํํ๋ฉด ์ข์ ๊ฒฝ์ฐ
Linux, Windows, macOS๋ฅผ ๋ชจ๋ ์ง์ํด์ผ ํ๊ณ , ๊ฐ ํ๋ซํผ๋ณ๋ก ์ต์ ํ๋ ๋ฐ์ด๋๋ฆฌ๊ฐ ํ์ํ ๋
๋น๋ ์๊ฐ์ ์ต์ํํด์ผ ํ๋ ์๋ํ ํ๊ฒฝ์์ ๋ฐ์ด๋๋ฆฌ ์บ์ฑ์ด ํฐ ์ฅ์
์ฌ๋ฌ ๋ฒ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋์์ ๊ด๋ฆฌํ๊ฑฐ๋, ์ธ๋ฐํ ๋น๋ ์ต์ ์ ์ด๊ฐ ํ์ํ ๋
์ด๋ฏธ Python์ ์ฌ์ฉํ๋ ํ์ด๋ผ๋ฉด ์ค์น์ ์คํฌ๋ฆฝํ ์ด ์์ฐ์ค๋ฌ์
โ vcpkg๋ฅผ ์ ํํ๋ฉด ์ข์ ๊ฒฝ์ฐ
Visual Studio๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ๊ณ , Windows ํ๋ซํผ์ด ๋ฉ์ธ์ด๋ผ๋ฉด ๋ค์ดํฐ๋ธ ํตํฉ์ด ๊ฐ๋ ฅํจ
๋ณต์กํ ์ค์ ์์ด ๋ฐ๋ก ์์ํ๊ณ ์ถ์ ๋. ํ์ต ๊ณก์ ์ด ๋ฎ์์ ์ด๋ณด์์๊ฒ ์นํ์
vcpkg๋ ํจํค์ง ์ ๋ฐ์ดํธ๊ฐ ๋น ๋ฅธ ํธ์ด๊ณ , ์ปค๋ฎค๋ํฐ๊ฐ ํ๋ฐํจ
Azure DevOps, Visual Studio, WSL ๋ฑ MS ๋๊ตฌ๋ค๊ณผ ํจ๊ป ์ฌ์ฉํ ๋ ์๋์ง๊ฐ ์ข์
์ฌ์ค Conan๊ณผ vcpkg๋ฅผ ๋์์ ์ฌ์ฉํ๋ ๊ฒ๋ ๊ฐ๋ฅํด. ์๋ฅผ ๋ค์ด, ์ฃผ์ ์์กด์ฑ์ Conan์ผ๋ก ๊ด๋ฆฌํ๊ณ , Windows ์ ์ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ vcpkg๋ก ์ค์นํ๋ ์์ด์ง. ๋๊ตฌ๋ ๋ชฉ์ ์ ๋ง๊ฒ ์ ์ฐํ๊ฒ ์ฌ์ฉํ๋ ๊ฒ ์ต๊ณ ์ผ!
๐ ๏ธ ์ค์ ํ๋ก์ ํธ: ๋ ๋๊ตฌ๋ฅผ ํจ๊ป ์ฌ์ฉํ๊ธฐ
์ด๋ก ๋ง ๋ฐฐ์ฐ๋ฉด ์ฌ๋ฏธ์์ง? ์ค์ ํ๋ก์ ํธ์์ ์ด๋ป๊ฒ ํ์ฉํ๋์ง ์์ ๋ฅผ ๋ง๋ค์ด๋ณผ๊ฒ. ๊ฐ๋จํ ์น ์๋ฒ๋ฅผ ๋ง๋ค๋ฉด์ Conan๊ณผ vcpkg๋ฅผ ๋ชจ๋ ์ฌ์ฉํด๋ณด์! ๐
๐ ํ๋ก์ ํธ ์๊ตฌ์ฌํญ
๋ชฉํ: HTTP ์์ฒญ์ ๋ฐ์์ JSON ์๋ต์ ๋ฐํํ๋ ๊ฐ๋จํ ์น ์๋ฒ
์ฌ์ฉํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ:
- cpp-httplib: ๊ฒฝ๋ HTTP ์๋ฒ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- nlohmann-json: JSON ํ์ฑ ๋ฐ ์์ฑ
- spdlog: ๋ก๊น
- fmt: ๋ฌธ์์ด ํฌ๋งทํ
๐ฏ ๋ฐฉ๋ฒ 1: Conan์ผ๋ก ๊ตฌํ
[requires]
cpp-httplib/0.14.1
nlohmann_json/3.11.2
spdlog/1.12.0
fmt/10.1.1
[generators]
CMakeDeps
CMakeToolchain
[options]
cpp-httplib/*:with_openssl=False
cmake_minimum_required(VERSION 3.15)
project(WebServerConan CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(httplib REQUIRED)
find_package(nlohmann_json REQUIRED)
find_package(spdlog REQUIRED)
find_package(fmt REQUIRED)
add_executable(server_conan main.cpp)
target_link_libraries(server_conan
httplib::httplib
nlohmann_json::nlohmann_json
spdlog::spdlog
fmt::fmt
)
#include <httplib.h>
#include <nlohmann/json.hpp>
#include <spdlog/spdlog.h>
#include <fmt/core.h>
using json = nlohmann::json;
int main() {
httplib::Server svr;
spdlog::info("์๋ฒ ์์ ์ค...");
// GET ์๋ํฌ์ธํธ
svr.Get("/api/hello", [](const httplib::Request& req, httplib::Response& res) {
json response;
response["message"] = "Hello from Conan!";
response["timestamp"] = std::time(nullptr);
response["status"] = "success";
res.set_content(response.dump(2), "application/json");
spdlog::info("GET /api/hello ์์ฒญ ์ฒ๋ฆฌ๋จ");
});
// POST ์๋ํฌ์ธํธ
svr.Post("/api/echo", [](const httplib::Request& req, httplib::Response& res) {
try {
auto input = json::parse(req.body);
json response;
response["echo"] = input;
response["received_at"] = std::time(nullptr);
res.set_content(response.dump(2), "application/json");
spdlog::info("POST /api/echo ์์ฒญ ์ฒ๋ฆฌ๋จ");
} catch (const json::exception& e) {
json error;
error["error"] = "Invalid JSON";
error["details"] = e.what();
res.status = 400;
res.set_content(error.dump(2), "application/json");
spdlog::error("JSON ํ์ฑ ์ค๋ฅ: {}", e.what());
}
});
auto port = 8080;
spdlog::info("์๋ฒ๊ฐ ํฌํธ {}์์ ์คํ ์ค์
๋๋ค", port);
svr.listen("0.0.0.0", port);
return 0;
}
# ์์กด์ฑ ์ค์น
mkdir build && cd build
conan install .. --build=missing
# ๋น๋
cmake .. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release
cmake --build . --config Release
# ์คํ
./server_conan # Linux/macOS
# ๋๋
.\Release\server_conan.exe # Windows
์๋ฒ๊ฐ ์คํ๋๋ฉด ๋ธ๋ผ์ฐ์ ๋ curl๋ก ํ ์คํธํด๋ณผ ์ ์์ด:
# GET ์์ฒญ ํ
์คํธ
curl http://localhost:8080/api/hello
# POST ์์ฒญ ํ
์คํธ
curl -X POST http://localhost:8080/api/echo \
-H "Content-Type: application/json" \
-d '{"name":"Conan","type":"Package Manager"}'
๐ฏ ๋ฐฉ๋ฒ 2: vcpkg๋ก ๊ตฌํ
{
"name": "webserver-vcpkg",
"version": "1.0.0",
"dependencies": [
"cpp-httplib",
"nlohmann-json",
"spdlog",
"fmt"
],
"builtin-baseline": "2023.11.20"
}
cmake_minimum_required(VERSION 3.15)
project(WebServerVcpkg CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(httplib CONFIG REQUIRED)
find_package(nlohmann_json CONFIG REQUIRED)
find_package(spdlog CONFIG REQUIRED)
find_package(fmt CONFIG REQUIRED)
add_executable(server_vcpkg main.cpp)
target_link_libraries(server_vcpkg
PRIVATE
httplib::httplib
nlohmann_json::nlohmann_json
spdlog::spdlog
fmt::fmt
)
main.cpp๋ ์์ Conan ๋ฒ์ ๊ณผ ๋์ผํด! ์ฝ๋๋ ํจํค์ง ๊ด๋ฆฌ์์ ๋ ๋ฆฝ์ ์ด๋๊น. ๐
# CMake ์ค์ (vcpkg toolchain ์ฌ์ฉ)
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=[vcpkg root]/scripts/buildsystems/vcpkg.cmake
# ๋น๋
cmake --build build --config Release
# ์คํ
./build/server_vcpkg # Linux/macOS
# ๋๋
.\build\Release\server_vcpkg.exe # Windows
์ด ์์ ์์ ์ฃผ๋ชฉํ ์ ์ main.cpp๊ฐ ์์ ํ ๋์ผํ๋ค๋ ๊ฑฐ์ผ! ํจํค์ง ๊ด๋ฆฌ์๋ ๋น๋ ์์คํ ์ ์ผ๋ถ์ผ ๋ฟ, ์ค์ ์ฝ๋์๋ ๋ถ๋ฆฌ๋์ด ์์ด. ์ด๊ฒ ๋ฐ๋ก ์ข์ ์ํคํ ์ฒ์ ํน์ง์ด์ง!
๐ฅ ๊ณ ๊ธ ์ฃผ์ : ํจํค์ง ๊ด๋ฆฌ ๋ฒ ์คํธ ํ๋ํฐ์ค
์ด์ ๊ธฐ๋ณธ์ ๋ง์คํฐํ์ผ๋, ์ค๋ฌด์์ ์ ๋ง ์ค์ํ ๋ฒ ์คํธ ํ๋ํฐ์ค๋ค์ ์๋ ค์ค๊ฒ. ์ด๋ฐ ๊ฒ๋ค์ ์๊ณ ์์ผ๋ฉด ํ๋ก ๊ฐ๋ฐ์์ฒ๋ผ ๋ณด์ผ ๊ฑฐ์ผ! ๐
๐ 1. ๋ฒ์ ๊ณ ์ ํ๊ธฐ (Version Pinning)
๋ฌธ์ : "๋ด ์ปดํจํฐ์์๋ ๋๋๋ฐ์?"๋ผ๋ ๋ง์ ๋ค์ด๋ณธ ์ ์์ง? ์ด๊ฑด ๋๋ถ๋ถ ๋ฒ์ ๋ถ์ผ์น ๋๋ฌธ์ด์ผ.
ํด๊ฒฐ์ฑ
: ํญ์ ์ ํํ ๋ฒ์ ์ ๋ช
์ํด!
# ๋์ ์ (Conan)
[requires]
boost/* # ์ด๋ค ๋ฒ์ ์ด ์ค์น๋ ์ง ๋ชจ๋ฆ!
# ์ข์ ์
[requires]
boost/1.82.0 # ์ ํํ ๋ฒ์ ๋ช
์
// ๋์ ์ (vcpkg.json)
{
"dependencies": ["boost"] // ์ต์ ๋ฒ์ ์ด ์๋์ผ๋ก...
}
// ์ข์ ์
{
"dependencies": [
{
"name": "boost",
"version>=": "1.82.0"
}
],
"builtin-baseline": "2023.11.20" // baseline์ผ๋ก ์ ์ฒด ๋ฒ์ ๊ณ ์
}
๐ 2. ์์กด์ฑ ์ต์ํํ๊ธฐ
์์กด์ฑ์ด ๋ง์์ง์๋ก ๊ด๋ฆฌ๊ฐ ์ด๋ ค์์ ธ. ํนํ ์์กด์ฑ์ ์์กด์ฑ(transitive dependencies)๊น์ง ๊ณ ๋ คํ๋ฉด ๋ณต์ก๋๊ฐ ๊ธฐํ๊ธ์์ ์ผ๋ก ์ฆ๊ฐํด!
์์น:
1. ์ ๋ง ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ง ์ถ๊ฐํ๊ธฐ
2. ํค๋ ์จ๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ํธํ๊ธฐ (๋น๋ ์๊ฐ ๋จ์ถ)
3. ํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ณด๋ค ์๊ณ ์ง์ค๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ํธํ๊ธฐ
์์:
์ ์ฒด Boost๋ฅผ ์ค์นํ๋ ๋์ , ํ์ํ ๋ชจ๋๋ง ์ค์น:
# Boost ์ ์ฒด (์ GB!)
conan install boost/1.82.0
# ํ์ํ ๊ฒ๋ง (์์ญ MB)
conan install boost-filesystem/1.82.0
conan install boost-asio/1.82.0
๐ 3. ๋ก์ปฌ ์บ์ ๊ด๋ฆฌํ๊ธฐ
ํจํค์ง ๊ด๋ฆฌ์๋ฅผ ์ค๋ ์ฌ์ฉํ๋ค ๋ณด๋ฉด ๋ก์ปฌ ์บ์๊ฐ ์์ฒญ๋๊ฒ ์ปค์ ธ. ์ ๊ธฐ์ ์ผ๋ก ์ ๋ฆฌํด์ฃผ๋ ๊ฒ ์ข์! ๐งน
Conan ์บ์ ๊ด๋ฆฌ
# ์บ์ ์์น ํ์ธ
conan config home
# ์ฌ์ฉํ์ง ์๋ ํจํค์ง ์ ๊ฑฐ
conan remove "*" -c
# ํน์ ํจํค์ง๋ง ์ ๊ฑฐ
conan remove "boost/*"
# ์บ์ ํฌ๊ธฐ ํ์ธ (Linux/macOS)
du -sh ~/.conan2
vcpkg ์บ์ ๊ด๋ฆฌ
# ๋น๋ ์บ์ ์ ๋ฆฌ
vcpkg remove --outdated
# ์ ์ฒด ์ฌ์ค์น๊ฐ ํ์ํ๋ฉด
rm -rf vcpkg/buildtrees
rm -rf vcpkg/packages
rm -rf vcpkg/downloads
๐ 4. CI/CD ํตํฉํ๊ธฐ
ํ๋์ ์ธ ๊ฐ๋ฐ์์ CI/CD๋ ํ์์ผ. ํจํค์ง ๊ด๋ฆฌ์๋ฅผ CI ํ์ดํ๋ผ์ธ์ ํตํฉํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์!
GitHub Actions ์์ (Conan)
name: Build with Conan
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install Conan
run: pip install conan
- name: Install dependencies
run: |
mkdir build && cd build
conan install .. --build=missing
- name: Build
run: |
cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake
cmake --build .
- name: Test
run: |
cd build
ctest --output-on-failure
GitHub Actions ์์ (vcpkg)
name: Build with vcpkg
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install vcpkg
run: |
git clone https://github.com/microsoft/vcpkg.git
./vcpkg/bootstrap-vcpkg.sh
- name: Build
run: |
cmake -B build -S . \
-DCMAKE_TOOLCHAIN_FILE=${{ github.workspace }}/vcpkg/scripts/buildsystems/vcpkg.cmake
cmake --build build
- name: Test
run: |
cd build
ctest --output-on-failure
CI์์ ๋งค๋ฒ ํจํค์ง๋ฅผ ๋ค์ ๋น๋ํ๋ฉด ์๊ฐ์ด ์ค๋ ๊ฑธ๋ ค. GitHub Actions์ ์บ์ฑ ๊ธฐ๋ฅ์ ํ์ฉํ๋ฉด ๋น๋ ์๊ฐ์ ํฌ๊ฒ ๋จ์ถํ ์ ์์ด!
๐ 5. ๋ณด์ ๊ณ ๋ ค์ฌํญ
์คํ์์ค ํจํค์ง๋ฅผ ์ฌ์ฉํ ๋๋ ํญ์ ๋ณด์์ ์ผ๋์ ๋์ด์ผ ํด. ์ ์์ ์ธ ์ฝ๋๊ฐ ํฌํจ๋ ์ ์๊ฑฐ๋ .
๋ณด์ ์ฒดํฌ๋ฆฌ์คํธ:
1. ๊ณต์ ์ ์ฅ์๋ง ์ฌ์ฉํ๊ธฐ
- Conan: ConanCenter (center.conan.io)
- vcpkg: ๊ณต์ GitHub ์ ์ฅ์
2. ํจํค์ง ๊ฒ์ฆํ๊ธฐ
- ๋ค์ด๋ก๋ ์, ๋ณ์ , ์ต๊ทผ ์
๋ฐ์ดํธ ๋ ์ง ํ์ธ
- GitHub์์ ์์ค์ฝ๋ ์ง์ ํ์ธ
- ์๋ ค์ง ์ทจ์ฝ์ ๊ฒ์ (CVE ๋ฐ์ดํฐ๋ฒ ์ด์ค)
3. ์ ๊ธฐ์ ์ธ ์
๋ฐ์ดํธ
- ๋ณด์ ํจ์น๊ฐ ํฌํจ๋ ์ ๋ฒ์ ์ผ๋ก ์
๋ฐ์ดํธ
- ํ์ง๋ง ๋ฉ์ด์ ๋ฒ์ ์
๊ทธ๋ ์ด๋๋ ์ ์คํ๊ฒ!
4. ์์กด์ฑ ์ค์บ ๋๊ตฌ ์ฌ์ฉ
- OWASP Dependency-Check
- Snyk
- GitHub Dependabot
๐จ ํํ ๋ฌธ์ ๋ค๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ
์ค์ ๋ก ์ฌ์ฉํ๋ค ๋ณด๋ฉด ์ฌ๋ฌ ๊ฐ์ง ๋ฌธ์ ์ ๋ถ๋ชํ๊ฒ ๋ผ. ๋ด๊ฐ ๊ฒช์๋ (๊ทธ๋ฆฌ๊ณ ํด๊ฒฐํ๋!) ๋ฌธ์ ๋ค์ ๊ณต์ ํ ๊ฒ. ๐ง
โ ๋ฌธ์ 1: "ํจํค์ง๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค"
์ฆ์:
ERROR: Package 'some-library/1.0.0' not found
์์ธ:
1. ํจํค์ง ์ด๋ฆ์ด๋ ๋ฒ์ ์ด ์๋ชป๋จ
2. ์๊ฒฉ ์ ์ฅ์๊ฐ ์ค์ ๋์ง ์์
3. ํจํค์ง๊ฐ ํด๋น ํ๋ซํผ์ ์ง์ํ์ง ์์
ํด๊ฒฐ ๋ฐฉ๋ฒ:
# Conan: ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฒ์ ๊ฒ์
conan search "some-library*" -r=conancenter
# vcpkg: ํจํค์ง ๊ฒ์
vcpkg search some-library
# ์๊ฒฉ ์ ์ฅ์ ํ์ธ
conan remote list # Conan
vcpkg version # vcpkg
โ ๋ฌธ์ 2: ๋ฒ์ ์ถฉ๋
์ฆ์:
ERROR: Version conflict detected: library-a requires boost/1.70.0 but library-b requires boost/1.75.0
ํด๊ฒฐ ๋ฐฉ๋ฒ:
1. ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ชจ๋ ํธํ๋๋ Boost ๋ฒ์ ์ฐพ๊ธฐ
2. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ํ๋๋ฅผ ์
๋ฐ์ดํธํ๊ฑฐ๋ ๋ค์ด๊ทธ๋ ์ด๋
3. ์ตํ์ ์๋จ: ๋ณ๋์ ํ๋ก์ ํธ๋ก ๋ถ๋ฆฌ
# Conan: ๋ฒ์ ์ค๋ฒ๋ผ์ด๋
[requires]
library-a/1.0.0
library-b/2.0.0
boost/1.75.0 # ๋ช
์์ ์ผ๋ก ๋ฒ์ ์ง์
[overrides]
boost/1.75.0 # ๋ชจ๋ ์์กด์ฑ์์ ์ด ๋ฒ์ ๊ฐ์
โ ๋ฌธ์ 3: ๋น๋ ์คํจ
์ฆ์:
ํจํค์ง๋ ์ค์น๋์๋๋ฐ ๋น๋ํ ๋ ๋งํฌ ์๋ฌ๋ ํค๋๋ฅผ ์ฐพ์ ์ ์๋ค๋ ์๋ฌ
์์ธ:
1. CMake ์ค์ ์ด ์๋ชป๋จ
2. ํ๋ซํผ/์ํคํ
์ฒ ๋ถ์ผ์น
3. ๋น๋ ํ์
๋ถ์ผ์น (Debug vs Release)
ํด๊ฒฐ ๋ฐฉ๋ฒ:
# Conan: ๋น๋ ํ์
๋ช
์
conan install .. --build=missing -s build_type=Release
# vcpkg: ํธ๋ฆฌํ๋ ๋ช
์
vcpkg install some-library:x64-windows
# CMake: ์์ธ ๋ก๊ทธ ํ์ธ
cmake .. --trace-expand
โ ๋ฌธ์ 4: ๋๋ฆฐ ๋น๋ ์๋
์ฆ์:
ํจํค์ง ์ค์น๋ ๋น๋์ ๋๋ฌด ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆผ
ํด๊ฒฐ ๋ฐฉ๋ฒ:
# Conan: ๋ฐ์ด๋๋ฆฌ ์บ์ ํ์ฑํ
conan config set storage.download_cache="~/.conan/download_cache"
# vcpkg: ๋ฐ์ด๋๋ฆฌ ์บ์ฑ
vcpkg install boost --binarysource=clear;files,C:\vcpkg-cache,readwrite
# ๋ณ๋ ฌ ๋น๋ ํ์ฑํ
cmake --build . -j 8 # 8๊ฐ ์ฝ์ด ์ฌ์ฉ
๋ํ ๋ถํ์ํ ์์กด์ฑ์ ์ ๊ฑฐํ๊ณ , ํค๋ ์จ๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ํธํ๋ ๊ฒ๋ ๋์์ด ๋ผ!
โ ๋ฌธ์ 5: ํฌ๋ก์ค ์ปดํ์ผ ๋ฌธ์
์ฆ์:
Windows์์ Linux์ฉ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋น๋ํ๊ฑฐ๋, x86์์ ARM์ฉ ๋น๋๋ฅผ ํ ๋ ๋ฌธ์ ๋ฐ์
ํด๊ฒฐ ๋ฐฉ๋ฒ:
# Conan: ํฌ๋ก์ค ์ปดํ์ผ ํ๋กํ์ผ ์์ฑ
# linux-arm64 ํ๋กํ์ผ ์์
[settings]
os=Linux
arch=armv8
compiler=gcc
compiler.version=11
build_type=Release
[buildenv]
CC=aarch64-linux-gnu-gcc
CXX=aarch64-linux-gnu-g++
# ์ฌ์ฉ
conan install .. --profile=linux-arm64
# vcpkg: ์ปค์คํ
ํธ๋ฆฌํ๋ ์์ฑ
# arm64-linux.cmake ํ์ผ ์์ฑ
set(VCPKG_TARGET_ARCHITECTURE arm64)
set(VCPKG_CRT_LINKAGE dynamic)
set(VCPKG_LIBRARY_LINKAGE static)
set(VCPKG_CMAKE_SYSTEM_NAME Linux)
# ์ฌ์ฉ
vcpkg install some-library:arm64-linux
๐ ๋ฏธ๋์ C++ ํจํค์ง ๊ด๋ฆฌ
C++ ํจํค์ง ๊ด๋ฆฌ์ ๋ฏธ๋๋ ์ด๋ป๊ฒ ๋ ๊น? ๋ช ๊ฐ์ง ํฅ๋ฏธ๋ก์ด ํธ๋ ๋๋ฅผ ์ดํด๋ณด์! ๐ฎ
๐ฆ C++ ํ์ค ํจํค์ง ๊ด๋ฆฌ์?
C++ ์ปค๋ฎค๋ํฐ์์๋ ์ค๋ซ๋์ "๊ณต์" ํจํค์ง ๊ด๋ฆฌ์๋ฅผ ์ํด์์ด. ์ค์ ๋ก C++23, C++26 ํ์คํ ๊ณผ์ ์์ ํจํค์ง ๊ด๋ฆฌ์ ๋ชจ๋ ์์คํ
์ ๋ํ ๋
ผ์๊ฐ ํ๋ฐํด.
C++ Modules๊ฐ C++20์์ ๋์
๋์๊ณ , ์ด๊ฒ ํจํค์ง ๊ด๋ฆฌ์ ๋ฏธ๋๋ฅผ ๋ฐ๊ฟ ์ ์์ด. ๋ชจ๋์ ํค๋ ํ์ผ์ ๋ฌธ์ ์ ๋ค์ ํด๊ฒฐํ๊ณ , ๋ ๋น ๋ฅธ ์ปดํ์ผ๊ณผ ๋ ๋์ ์์กด์ฑ ๊ด๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํด์ค.
โ๏ธ ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ ๋น๋
๋ฏธ๋์๋ ๋ก์ปฌ์์ ํจํค์ง๋ฅผ ๋น๋ํ๋ ๋์ , ํด๋ผ์ฐ๋์์ ๋ฏธ๋ฆฌ ๋น๋๋ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ค์ด๋ก๋ํ๋ ๊ฒ ํ์ค์ด ๋ ๊ฑฐ์ผ. ์ด๋ฏธ Conan๊ณผ vcpkg ๋ชจ๋ ์ด ๋ฐฉํฅ์ผ๋ก ๋ฐ์ ํ๊ณ ์์ด:
- JFrog Artifactory: Conan ํจํค์ง๋ฅผ ์ํ ์ํฐํ๋ผ์ด์ฆ๊ธ ์ ์ฅ์
- Azure Artifacts: vcpkg ๋ฐ์ด๋๋ฆฌ ์บ์ฑ
- GitHub Packages: ์คํ์์ค ํ๋ก์ ํธ๋ฅผ ์ํ ๋ฌด๋ฃ ํธ์คํ
๐ค AI ๊ธฐ๋ฐ ์์กด์ฑ ๊ด๋ฆฌ
์์ํด๋ด! AI๊ฐ ์๋์ผ๋ก:
- ํ๋ก์ ํธ์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ์ฒํด์ฃผ๊ณ
- ๋ฒ์ ์ถฉ๋์ ์๋์ผ๋ก ํด๊ฒฐํ๊ณ
- ๋ณด์ ์ทจ์ฝ์ ์ ๋ฏธ๋ฆฌ ๊ฒฝ๊ณ ํด์ฃผ๊ณ
- ์ต์ ์ ๋น๋ ์ค์ ์ ์ ์ํด์ฃผ๋ ๊ฑฐ์ผ!
์ด๋ฏธ GitHub Copilot ๊ฐ์ ๋๊ตฌ๋ค์ด ์ฝ๋ ์์ฑ์ ๋์์ฃผ๊ณ ์์์? ํจํค์ง ๊ด๋ฆฌ๋ ๊ณง ๊ทธ๋ ๊ฒ ๋ ๊ฑฐ์ผ. ๐
Conan๊ณผ vcpkg๋ฅผ ์ง๊ธ ๋ฐฐ์๋๋ฉด, ๋ฏธ๋์ C++ ํจํค์ง ๊ด๋ฆฌ ์์คํ ์ผ๋ก ์ ํํ ๋๋ ์ฝ๊ฒ ์ ์ํ ์ ์์ด. ํต์ฌ ๊ฐ๋ ๋ค์ ๋น์ทํ ํ ๋๊น!
๐ ํ์ต ๋ฆฌ์์ค์ ์ปค๋ฎค๋ํฐ
ํผ์ ๊ณต๋ถํ๊ธฐ ํ๋ค๋ค๋ฉด? ๊ฑฑ์ ๋ง! ํ๋ฅญํ ๋ฆฌ์์ค์ ์ปค๋ฎค๋ํฐ๊ฐ ๋ง์. ๐ฅ
๐ ๊ณต์ ๋ฌธ์
Conan:
- ๊ณต์ ๋ฌธ์: docs.conan.io
- ConanCenter: conan.io/center
- GitHub: github.com/conan-io/conan
vcpkg:
- ๊ณต์ ๋ฌธ์: vcpkg.io
- GitHub: github.com/microsoft/vcpkg
- ํจํค์ง ๊ฒ์: vcpkg.io/en/packages.html
๐ฌ ์ปค๋ฎค๋ํฐ
Conan:
- Slack: cpplang.slack.com (#conan ์ฑ๋)
- Reddit: r/cpp
- Stack Overflow: [conan] ํ๊ทธ
vcpkg:
- Discord: discord.gg/vcpkg
- GitHub Discussions: github.com/microsoft/vcpkg/discussions
- Stack Overflow: [vcpkg] ํ๊ทธ
๐ฅ ์ถ์ฒ ์์ ๋ฐ ํํ ๋ฆฌ์ผ
- CppCon ๋ฐํ ์์๋ค (YouTube์์ "CppCon Conan" ๋๋ "CppCon vcpkg" ๊ฒ์)
- Microsoft์ vcpkg ๊ณต์ ํํ ๋ฆฌ์ผ
- JFrog์ Conan ์จ๋น๋ ์๋ฆฌ์ฆ
- ๊ฐ์ข
๊ฐ๋ฐ์ ๋ธ๋ก๊ทธ๋ค
์ฌ๋ฅ๋ท(https://www.jaenung.net)์ '์ง์์ธ์ ์ฒ'์๋ C++ ํจํค์ง ๊ด๋ฆฌ๋ฟ๋ง ์๋๋ผ ๋ค์ํ ํ๋ก๊ทธ๋๋ฐ ์ง์์ด ๊ฐ๋ํด. ์ค๋ฌด ๊ฒฝํ์ด ํ๋ถํ ๊ฐ๋ฐ์๋ค์ด ๊ณต์ ํ๋ ํ๊ณผ ๋ ธํ์ฐ๋ฅผ ํ์ธํด๋ณด์ธ์!
๐ฏ ์ค์ ํ๋ก์ ํธ ์์ด๋์ด
์ด๋ก ๋ง ๋ฐฐ์ฐ๋ฉด ๊ธ๋ฐฉ ์์ด๋ฒ๋ ค. ์ง์ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค๋ฉด์ ์ฐ์ตํด๋ณด์! ์ฌ๊ธฐ ๋ช ๊ฐ์ง ์์ด๋์ด๋ฅผ ์ค๊ฒ. ๐ก
๐ฎ ํ๋ก์ ํธ 1: ๊ฐ๋จํ ๊ฒ์ ์์ง
์ฌ์ฉํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ:
- SDL2 (๊ทธ๋ํฝ ๋ฐ ์
๋ ฅ)
- GLM (์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)
- nlohmann-json (์ค์ ํ์ผ)
- spdlog (๋ก๊น
)
๋ฐฐ์ธ ์ ์๋ ๊ฒ:
- ์ฌ๋ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
- ํฌ๋ก์ค ํ๋ซํผ ๋น๋
- ๋ณต์กํ ์์กด์ฑ ๊ด๋ฆฌ
๐ ํ๋ก์ ํธ 2: RESTful API ์๋ฒ
์ฌ์ฉํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ:
- cpp-httplib ๋๋ Crow (HTTP ์๋ฒ)
- SQLite3 (๋ฐ์ดํฐ๋ฒ ์ด์ค)
- jwt-cpp (์ธ์ฆ)
- nlohmann-json (JSON ์ฒ๋ฆฌ)
๋ฐฐ์ธ ์ ์๋ ๊ฒ:
- ์น ์๋น์ค ๊ฐ๋ฐ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ํตํฉ
- ๋ณด์ ๊ณ ๋ ค์ฌํญ
๐ ํ๋ก์ ํธ 3: ๋ฐ์ดํฐ ๋ถ์ ๋๊ตฌ
์ฌ์ฉํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ:
- Eigen (์ ํ๋์)
- Matplotlib-cpp (์๊ฐํ)
- CSV-parser (๋ฐ์ดํฐ ์
๋ ฅ)
- Boost.Program_options (CLI)
๋ฐฐ์ธ ์ ์๋ ๊ฒ:
- ๊ณผํ ๊ณ์ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ
- ๋ฐ์ดํฐ ์๊ฐํ
- ๋ช
๋ น์ค ๋๊ตฌ ๊ฐ๋ฐ
๐ค ํ๋ก์ ํธ 4: ๋จธ์ ๋ฌ๋ ์ถ๋ก ์์ง
์ฌ์ฉํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ:
- ONNX Runtime (๋ชจ๋ธ ์ถ๋ก )
- OpenCV (์ด๋ฏธ์ง ์ฒ๋ฆฌ)
- Protobuf (๋ฐ์ดํฐ ์ง๋ ฌํ)
- gRPC (๋คํธ์ํฌ ํต์ )
๋ฐฐ์ธ ์ ์๋ ๊ฒ:
- AI/ML ํตํฉ
- ๊ณ ์ฑ๋ฅ ์ปดํจํ
- ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ
์ฒ
โจ ๋ง๋ฌด๋ฆฌํ๋ฉฐ
์! ์ฌ๊ธฐ๊น์ง ์ฝ์๋ค๋ฉด ์ ๋ง ๋๋จํด! ๐
์ฐ๋ฆฌ๋ ์ค๋ C++ ํจํค์ง ๊ด๋ฆฌ์ A๋ถํฐ Z๊น์ง ์ดํด๋ดค์ด. ์ ํต์ ์ธ ๋ฐฉ์์ ๋ฌธ์ ์ ๋ถํฐ ์์ํด์, Conan๊ณผ vcpkg๋ผ๋ ๋ ๊ฐ์ง ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ๋ฐฐ์ ์ง. ์ค์ ์์ ๋ ๋ง๋ค์ด๋ณด๊ณ , ๊ณ ๊ธ ๊ธฐ๋ฅ๋ค๊ณผ ๋ฒ ์คํธ ํ๋ํฐ์ค๋ ์์๋ดค์ด.
๐ฏ ํต์ฌ ์์ฝ
1. ํจํค์ง ๊ด๋ฆฌ์๋ ํ์
ํ๋์ ์ธ C++ ๊ฐ๋ฐ์์ ํจํค์ง ๊ด๋ฆฌ์๋ ์ ํ์ด ์๋๋ผ ํ์์ผ. ์๊ฐ์ ์ ์ฝํ๊ณ , ๋ฒ๊ทธ๋ฅผ ์ค์ด๊ณ , ํ์
์ ์ฝ๊ฒ ๋ง๋ค์ด์ค.
2. Conan vs vcpkg
- Conan: ๋ฐ์ด๋๋ฆฌ ์ฐ์ , ์ ์ฐํ ์ค์ , ํฌ๋ก์ค ํ๋ซํผ์ ๊ฐํจ
- vcpkg: ์์ค ๊ธฐ๋ฐ, ๊ฐํธํ ์ฌ์ฉ, Visual Studio ํตํฉ ์ฐ์
๋ ๋ค ํ๋ฅญํ ๋๊ตฌ๋๊น ํ๋ก์ ํธ์ ๋ง๊ฒ ์ ํํ๋ฉด ๋ผ!
3. ๋ฒ ์คํธ ํ๋ํฐ์ค
- ๋ฒ์ ์ ๋ช
ํํ๊ฒ ๊ณ ์ ํ๊ธฐ
- ์์กด์ฑ ์ต์ํํ๊ธฐ
- CI/CD์ ํตํฉํ๊ธฐ
- ๋ณด์ ํญ์ ์ผ๋์ ๋๊ธฐ
4. ๊ณ์ ๋ฐฐ์ฐ๊ธฐ
๊ธฐ์ ์ ๊ณ์ ๋ฐ์ ํด. ๊ณต์ ๋ฌธ์๋ฅผ ์ฝ๊ณ , ์ปค๋ฎค๋ํฐ์ ์ฐธ์ฌํ๊ณ , ์ค์ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค๋ฉด์ ๊ณ์ ์ฑ์ฅํ์!
1. ์์ ํ๋ก์ ํธ๋ถํฐ ์์ํด์ Conan์ด๋ vcpkg๋ฅผ ์ ์ฉํด๋ณด๊ธฐ
2. ๊ธฐ์กด ํ๋ก์ ํธ๋ฅผ ํจํค์ง ๊ด๋ฆฌ์๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๊ธฐ
3. ํ์๋ค๊ณผ ์ง์ ๊ณต์ ํ๊ธฐ
4. ์คํ์์ค ํ๋ก์ ํธ์ ๊ธฐ์ฌํ๋ฉด์ ์ค๋ ฅ ํค์ฐ๊ธฐ
์ฌ๋ฅ๋ท์์ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ ๊ฒฝํ๋ด๋ ์ฝ์ด๋ณด๊ณ , ๊ถ๊ธํ ์ ์ด ์์ผ๋ฉด ์ง๋ฌธ๋ ์ฌ๋ ค๋ด. ํจ๊ป ์ฑ์ฅํ๋ ๊ฒ ์ ์ผ ๋น ๋ฅธ ๊ธธ์ด์ผ!
C++ ๊ฐ๋ฐ์ด ์ ์ ๋ ํ๋์ ์ด๊ณ ํธ๋ฆฌํด์ง๊ณ ์์ด. ํจํค์ง ๊ด๋ฆฌ์๋ ๊ทธ ๋ณํ์ ์ค์ฌ์ ์์ง. ์ค๋ ๋ฐฐ์ด ๋ด์ฉ์ ๋ฐํ์ผ๋ก ๋ ๋์ C++ ๊ฐ๋ฐ์๊ฐ ๋๊ธธ ๋ฐ๋ผ! ๐ช
์ง๋ฌธ์ด๋ ํผ๋๋ฐฑ์ด ์๋ค๋ฉด ์ธ์ ๋ ์ง ํ์์ด์ผ. ์ฐ๋ฆฌ ๋ชจ๋ ํจ๊ป ๋ฐฐ์ฐ๊ณ ์ฑ์ฅํ๋ ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ๋ฅผ ๋ง๋ค์ด๊ฐ์! ๐
ํ๋ณตํ ์ฝ๋ฉ ๋๊ธธ! Happy Coding! ๐
๐ ๋ ๋ง์ C++ ์ง์์ด ํ์ํ์ ๊ฐ์?
์ฌ๋ฅ๋ท์ '์ง์์ธ์ ์ฒ'์์ ๋ค์ํ ํ๋ก๊ทธ๋๋ฐ ์ง์์ ํํํด๋ณด์ธ์!
์ค๋ฌด ๊ฒฝํ์ด ํ๋ถํ ๊ฐ๋ฐ์๋ค์ด ๊ณต์ ํ๋ ์์ํ ๋
ธํ์ฐ๊ฐ ๊ฐ๋ํฉ๋๋ค.
๊ด๋ จ ํค์๋
๋๊ธ ์์ฑ
์ด ๊ธ์ ๋ํ ์ฌ๋ฌ๋ถ์ ์๊ฐ์ ๋ค๋ ค์ฃผ์ธ์
๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค
๋๊ธ์ ์์ฑํ๋ ค๋ฉด ๋จผ์ ๋ก๊ทธ์ธํด์ฃผ์ธ์.
๋๊ธ 0
์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์์ง ๋๊ธ์ด ์์ต๋๋ค.