Skip to main content

개발 환경 준비하기

Views 26약 11분생성형 AI 활용
Summary

문법보다 먼저 만나는 첫 번째 장벽

C++을 처음 배울 때 가장 당황스러운 순간은 class도, 포인터도, 템플릿도 아닐 때가 많습니다. 의외로 많은 사람이 첫 번째 줄을 실행하기도 전에 이런 벽을 만납니다.

"분명히 코드는 맞는 것 같은데 왜 실행이 안 되지?"

C++은 파이썬이나 자바스크립트처럼 파일을 바로 실행하는 언어가 아닙니다. 우리가 작성한 .cpp 파일은 컴퓨터가 곧장 이해할 수 없습니다. 먼저 컴파일러가 소스 코드를 기계어에 가까운 형태로 번역하고, 필요한 조각들을 링커가 하나의 실행 파일로 묶어야 합니다. 그다음에야 프로그램을 실행할 수 있습니다.

그래서 C++ 학습의 첫 관문은 문법이 아니라 도구의 흐름을 이해하는 것입니다. 개발 환경을 제대로 준비하면 앞으로 만날 시행착오를 크게 줄일 수 있습니다. 반대로 이 단계를 대충 넘기면, 문법 오류인지 설치 오류인지, 컴파일 문제인지 실행 문제인지 구분하지 못한 채 시간을 잃게 됩니다.

이번 장의 목표는 단순합니다. 여러분의 컴퓨터에서 C++ 코드를 작성하고, 컴파일하고, 실행할 수 있는 상태를 만드는 것입니다. 더 중요한 목표는 "내 코드가 어떤 과정을 거쳐 실행 파일이 되는지" 감각을 잡는 것입니다.

개발 환경 준비하기

C++ 개발 환경을 이루는 도구들

C++ 개발 환경은 하나의 프로그램만 설치한다고 완성되지 않습니다. 보통 여러 도구가 함께 움직입니다.

  • 편집기 또는 IDE는 코드를 작성하는 공간입니다.

  • 컴파일러는 C++ 코드를 실행 가능한 형태로 번역합니다.

  • 디버거는 프로그램을 한 줄씩 실행하며 문제를 추적하게 해 줍니다.

  • 빌드 도구는 여러 파일과 옵션을 묶어 반복 가능한 빌드 과정을 만듭니다.

여기서 가장 먼저 구분해야 할 것은 VS Code와 Visual Studio는 같은 제품이 아니라는 점입니다.

VS Code는 가볍고 확장성이 뛰어난 편집기입니다. C/C++ 확장을 설치하면 문법 색상, 자동 완성, 오류 표시 같은 기능을 사용할 수 있지만, 확장 자체에 C++ 컴파일러나 디버거가 포함되어 있지는 않습니다.1 즉, VS Code만 설치하고 "왜 C++이 실행되지 않지?"라고 고민하면 안 됩니다. 별도의 컴파일러를 설치하고, 터미널에서 인식되도록 PATH를 설정해야 합니다.

Visual Studio는 훨씬 더 큰 도구입니다. MSVC 컴파일러, 디버거, 프로젝트 시스템, Windows SDK 등을 한 번에 제공하는 통합 개발 환경, 즉 IDE입니다. Windows에서 C++을 처음 시작한다면 Visual Studio는 가장 편한 선택일 수 있습니다. 대신 설치 용량이 크고 기능이 많아 처음에는 조금 압도적으로 느껴질 수 있습니다.

둘 중 무엇이 더 좋다고 단정할 필요는 없습니다. 중요한 것은 "나는 지금 어떤 방식으로 C++을 배울 것인가?"입니다.

상황추천 환경
Windows에서 설치와 실행을 최대한 쉽게 시작하고 싶다Visual Studio + MSVC
가볍고 범용적인 편집기를 쓰고 싶다VS Code + GCC/Clang/MSVC + CMake
Linux 서버 개발 감각을 익히고 싶다Linux 또는 WSL + GCC/Clang + CMake
macOS에서 자연스럽게 시작하고 싶다Xcode Command Line Tools 기반 Clang + VS Code 또는 Xcode
여러 운영체제에서 같은 프로젝트 구조를 쓰고 싶다CMake 기반 프로젝트

이 책에서는 특정 IDE에 갇히지 않는 감각을 기르기 위해 터미널 명령과 CMake를 함께 소개합니다. 하지만 Windows 독자라면 Visual Studio로 시작해도 전혀 문제없습니다.

컴파일러 선택하기: GCC, Clang, MSVC

C++ 컴파일러는 여러 종류가 있습니다. 입문 단계에서는 세 이름만 기억해도 충분합니다. GCC, Clang, MSVC입니다.

GCC는 Linux 세계에서 가장 널리 쓰이는 컴파일러입니다. 오랜 시간 검증되었고, 서버, 임베디드, 오픈소스 프로젝트에서 자주 만납니다. Linux에서 g++ 명령을 사용한다면 대개 GCC를 쓰고 있는 것입니다.

Clang은 LLVM 프로젝트의 컴파일러입니다. 에러 메시지가 비교적 읽기 좋고, macOS와 iOS 개발 환경에서 기본적으로 많이 쓰입니다. macOS에서 Xcode Command Line Tools를 설치하면 보통 clang++를 사용하게 됩니다.

MSVC는 Microsoft Visual C++ 컴파일러입니다. Windows 네이티브 개발, Visual Studio, DirectX, Windows API와 잘 맞습니다. Windows에서 게임 개발이나 데스크톱 애플리케이션 개발을 한다면 자주 만나게 됩니다.

운영체제별로 현실적인 선택은 다음과 같습니다.

운영체제주로 쓰는 컴파일러설명
WindowsMSVC, MinGW-w64 GCC, LLVM/ClangVisual Studio를 쓰면 MSVC가 가장 자연스럽고, VS Code에서는 MSYS2/MinGW-w64 또는 LLVM을 함께 쓰는 경우가 많습니다.
LinuxGCC, Clang배포판 패키지 관리자로 쉽게 설치할 수 있습니다. 서버 개발과 가장 가까운 환경입니다.
macOSClangXcode Command Line Tools 설치 후 clang++를 사용할 수 있습니다.

입문자는 "어떤 컴파일러가 최고인가?"보다 "내 운영체제에서 안정적으로 설치되고, 이 책의 예제를 C++20 기준으로 빌드할 수 있는가?"를 먼저 봐야 합니다. 성능 최적화, ABI 호환성, 표준 라이브러리 차이는 나중에 실전 프로젝트에서 더 깊이 다룹니다.

설치 확인부터 하자

컴파일러를 설치했다면 가장 먼저 터미널에서 버전을 확인합니다. 이 단계는 생각보다 중요합니다. 편집기 화면에서 버튼을 누르기 전에, 터미널에서 컴파일러가 실제로 잡히는지 확인해야 합니다.

GCC 계열을 설치했다면 다음 명령을 입력합니다.

g++ --version

Clang을 설치했다면 다음 명령을 입력합니다.

clang++ --version

CMake를 설치했다면 다음 명령도 확인합니다.

cmake --version

Windows에서 MSVC를 사용한다면 일반 명령 프롬프트가 아니라 Developer Command Prompt for Visual Studio 또는 Developer PowerShell for Visual Studio를 여는 것이 안전합니다. 그 안에서 다음 명령을 입력합니다.

cl

g++, clang++, cl, cmake 명령이 "찾을 수 없는 명령"이라고 나온다면, 대부분 설치가 안 되었거나 PATH 설정이 빠진 것입니다. PATH는 운영체제가 실행 파일을 찾는 검색 경로입니다. 쉽게 말해, 터미널이 "g++라는 이름을 들었을 때 어디로 가서 찾아야 하는지" 알려 주는 주소록입니다.

설치 후 PATH를 수정했다면 이미 열려 있던 터미널이나 VS Code를 닫고 다시 열어야 적용되는 경우가 많습니다. 이 작은 사실 하나 때문에 한 시간을 잃는 일이 정말 흔합니다.

운영체제별 준비 방법

여기서는 세부 화면을 하나하나 따라 하는 설치 매뉴얼 대신, 무엇을 설치해야 하는지 큰 흐름을 잡겠습니다. 설치 화면과 버전은 시간이 지나며 바뀔 수 있으므로, 실제 설치는 각 도구의 공식 안내를 함께 확인하는 것이 좋습니다.

Windows: Visual Studio 또는 VS Code 조합

Windows에서는 크게 두 길이 있습니다.

첫 번째는 Visual Studio Community를 설치하는 방법입니다. 설치 관리자에서 "C++를 사용한 데스크톱 개발" 워크로드를 선택하면 MSVC 컴파일러, 디버거, Windows SDK 등이 함께 설치됩니다. 입문자가 "일단 실행되는 환경"을 빠르게 만들기에는 가장 수월합니다.

두 번째는 VS Code + 별도 컴파일러 조합입니다. 이 경우 VS Code를 설치한 뒤 Microsoft의 C/C++ 확장을 설치하고, 추가로 MSYS2/MinGW-w64 또는 LLVM을 설치해야 합니다. MSYS2를 사용하는 경우 보통 패키지 관리자인 pacman으로 GCC 도구 모음을 설치합니다.

예를 들어 MSYS2의 UCRT64 환경을 사용하는 경우 다음과 같은 명령을 볼 수 있습니다.

pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain

설치 후에는 보통 다음과 같은 bin 경로를 Windows PATH에 추가합니다.

C:msys64ucrt64bin

또는 설치 방식에 따라 다음 경로를 쓰기도 합니다.

C:msys64mingw64bin

경로는 여러분이 실제로 설치한 환경에 맞아야 합니다. 인터넷 글을 그대로 복사하기보다, 내 컴퓨터에 g++.exe가 실제로 들어 있는 폴더를 확인하세요.

Linux: 패키지 관리자로 설치

Linux에서는 대체로 설치가 간단합니다. Ubuntu나 Debian 계열이라면 다음 명령으로 기본 개발 도구를 설치할 수 있습니다.

sudo apt update
sudo apt install build-essential cmake gdb

Fedora 계열이라면 다음과 비슷합니다.

sudo dnf install gcc gcc-c++ cmake gdb

Arch 계열이라면 다음 명령을 사용할 수 있습니다.

sudo pacman -S gcc cmake gdb

설치 후에는 g++ --version과 cmake --version으로 확인합니다.

macOS: Xcode Command Line Tools

macOS에서는 터미널에서 다음 명령을 실행해 Xcode Command Line Tools를 설치할 수 있습니다.

xcode-select --install

설치가 끝나면 보통 clang++를 사용할 수 있습니다.

clang++ --version

CMake는 공식 설치 파일을 사용하거나 Homebrew를 통해 설치할 수 있습니다.

brew install cmake

Homebrew를 사용하지 않는다면 CMake 공식 다운로드 페이지에서 macOS용 설치 파일을 받을 수도 있습니다.

첫 번째 C++ 프로그램

이제 진짜로 C++ 코드를 실행해 봅시다. 원하는 위치에 hello_cpp라는 폴더를 만들고, 그 안에 main.cpp 파일을 만듭니다.

#include <iostream>

int main()
{
    std::cout << "Hello, C++!n";
    return 0;
}

아직 #include, std::cout, main을 완벽히 이해하지 않아도 괜찮습니다. 지금은 개발 환경이 제대로 작동하는지 확인하는 것이 목적입니다. 그래도 대략적인 의미는 알아두면 좋습니다.

#include <iostream>은 화면 출력에 필요한 표준 라이브러리를 가져옵니다. int main()은 C++ 프로그램이 시작되는 함수입니다. std::cout은 콘솔에 값을 출력할 때 사용합니다. 마지막의 return 0;은 프로그램이 정상적으로 끝났다는 신호입니다.

GCC를 사용한다면 터미널에서 다음과 같이 컴파일합니다.

g++ -std=c++20 -Wall -Wextra -pedantic main.cpp -o hello

Linux나 macOS에서는 다음과 같이 실행합니다.

./hello

Windows에서 MinGW-w64 GCC를 사용한다면 실행 파일 이름을 hello.exe로 만드는 편이 익숙합니다.

g++ -std=c++20 -Wall -Wextra -pedantic main.cpp -o hello.exe
.hello.exe

Clang을 사용한다면 g++ 대신 clang++를 쓰면 됩니다.

clang++ -std=c++20 -Wall -Wextra -pedantic main.cpp -o hello
./hello

MSVC를 사용한다면 Developer Command Prompt 또는 Developer PowerShell에서 다음 명령을 실행합니다.

cl /std:c++20 /EHsc /W4 main.cpp
main.exe

화면에 다음 문장이 출력되면 성공입니다.

Hello, C++!

이 작은 출력은 생각보다 큰 의미가 있습니다. 여러분의 컴퓨터는 이제 C++ 소스 파일을 받아 실행 파일로 만들 수 있습니다. 이제부터는 C++ 문법을 배울 때마다 "진짜 프로그램"으로 확인할 수 있습니다.

컴파일, 링크, 실행의 흐름

방금 우리는 한 줄 명령으로 프로그램을 만들었습니다.

g++ -std=c++20 main.cpp -o hello

이 명령 하나 안에는 사실 두 단계가 숨어 있습니다. 첫 번째는 컴파일이고, 두 번째는 링크입니다.

컴파일은 .cpp 파일을 목적 파일로 바꾸는 단계입니다. 목적 파일은 운영체제에 따라 .o 또는 .obj 같은 확장자를 가집니다.

g++ -std=c++20 -c main.cpp -o main.o

링크는 목적 파일과 필요한 라이브러리를 묶어 실행 파일을 만드는 단계입니다.

g++ main.o -o hello

그다음 실행합니다.

./hello

이 흐름을 그림처럼 생각하면 다음과 같습니다.

main.cpp  --컴파일-->  main.o  --링크-->  hello  --실행-->  결과 출력

입문 단계에서 이 구분은 매우 중요합니다. 오류가 어디서 발생했는지 알 수 있기 때문입니다.

컴파일 오류는 문법이 틀렸거나, 타입이 맞지 않거나, 필요한 헤더를 찾지 못할 때 발생합니다. 예를 들어 세미콜론을 빠뜨리면 컴파일러가 소스 코드를 번역하지 못합니다.

#include <iostream>

int main()
{
    std::cout << "Hello" << "n"
    return 0;
}

위 코드는 std::cout 줄 끝에 세미콜론이 없으므로 컴파일 오류가 납니다.

링크 오류는 선언은 보았지만 실제 정의를 찾지 못할 때 자주 발생합니다.

#include <iostream>

int add(int a, int b);

int main()
{
    std::cout << add(1, 2) << "n";
    return 0;
}

이 코드는 add 함수가 있다고 선언만 했고, 실제 몸체를 제공하지 않았습니다. 컴파일러는 "그런 함수가 있나 보다" 하고 넘어갈 수 있지만, 링커는 실행 파일을 만들 때 "그 함수의 실제 코드는 어디 있지?" 하고 멈춥니다. GCC나 Clang에서는 undefined reference, MSVC에서는 unresolved external symbol 같은 메시지를 볼 수 있습니다.

실행 오류는 컴파일과 링크는 성공했지만 프로그램을 실행하는 동안 문제가 생기는 경우입니다. 예를 들어 잘못된 메모리에 접근하거나, 파일을 찾지 못하거나, 결과가 기대와 다르게 나오는 경우입니다.

이 세 종류의 오류를 구분할 수 있으면 C++ 디버깅의 절반은 이미 시작한 것입니다.

VS Code에서 C++ 개발하기

VS Code로 C++을 개발할 때 가장 흔한 오해는 "확장만 설치하면 실행까지 다 된다"는 생각입니다. 다시 강조하지만 VS Code는 편집기입니다. C/C++ 확장은 코드 작성을 도와줄 뿐, 컴파일러를 대신 설치해 주지 않습니다.1

VS Code에서 최소한으로 확인해야 할 것은 다음과 같습니다.

  • C++ 컴파일러가 설치되어 있고 터미널에서 g++ --version 또는 clang++ --version이 동작해야 합니다.

  • Microsoft C/C++ 확장이 설치되어 있어야 자동 완성, 코드 이동, 오류 표시 기능을 편하게 쓸 수 있습니다.

  • 여러 파일 프로젝트를 다루려면 CMake와 CMake Tools 확장을 함께 사용하는 것이 좋습니다.

단일 파일을 빠르게 컴파일하려면 VS Code의 통합 터미널을 열고 직접 명령을 입력해도 됩니다.

g++ -std=c++20 -Wall -Wextra -g main.cpp -o hello
./hello

여기서 -g는 디버깅 정보를 넣으라는 뜻입니다. 나중에 디버거가 "현재 몇 번째 줄을 실행 중인지", "변수 값이 무엇인지" 알려면 이런 정보가 필요합니다.

VS Code에서는 tasks.json을 만들어 Ctrl + Shift + B로 빌드하도록 설정할 수도 있습니다. 하지만 이 책에서는 너무 이른 시점에 VS Code 설정 파일을 길게 다루지 않겠습니다. 처음에는 터미널에서 직접 명령을 실행해 보는 편이 C++의 흐름을 이해하는 데 더 좋습니다.

다만 프로젝트가 파일 하나를 넘어가면 이야기가 달라집니다. main.cpp, user.cpp, account.cpp처럼 여러 파일이 생기면 매번 긴 컴파일 명령을 직접 입력하기가 불편합니다. 이때 CMake가 등장합니다.

Visual Studio에서 C++ 개발하기

Windows에서 Visual Studio를 사용한다면 흐름은 조금 다릅니다. Visual Studio는 컴파일러와 디버거, 프로젝트 시스템이 통합되어 있으므로, 터미널 명령을 직접 입력하지 않고도 빌드와 실행이 가능합니다.

처음 시작할 때는 다음 흐름으로 진행하면 됩니다.

  • Visual Studio Installer에서 "C++를 사용한 데스크톱 개발" 워크로드를 설치합니다.

  • Visual Studio를 실행하고 "빈 프로젝트" 또는 콘솔 앱 프로젝트를 만듭니다.

  • main.cpp 파일을 추가하고 첫 번째 C++ 코드를 작성합니다.

  • Ctrl + F5로 디버깅 없이 실행하거나, F5로 디버깅을 시작합니다.

Visual Studio의 장점은 디버거입니다. 중단점을 찍고, 한 줄씩 실행하고, 변수 값을 확인하는 경험이 매우 자연스럽습니다. 특히 Windows 환경에서 게임 개발이나 데스크톱 애플리케이션을 목표로 한다면 Visual Studio에 익숙해지는 것이 큰 도움이 됩니다.

다만 Visual Studio 프로젝트 파일에만 의존하면 Linux나 macOS에서 같은 프로젝트를 빌드하기 어렵습니다. 그래서 실무에서는 Visual Studio를 사용하더라도 CMake 기반 프로젝트를 함께 사용하는 경우가 많습니다.

CMake란 무엇인가?

CMake는 컴파일러가 아닙니다. CMake는 코드를 직접 번역하지 않습니다. 대신 "이 프로젝트는 어떤 소스 파일로 구성되어 있고, 어떤 실행 파일을 만들며, 어떤 C++ 표준을 쓰고, 어떤 라이브러리를 연결해야 하는지"를 선언하는 도구입니다.

조금 비유해 봅시다. 컴파일러가 요리사라면 CMake는 주방장에게 전달하는 레시피와 작업 지시서에 가깝습니다. "이 재료들을 사용해서, 이 순서로, 이 요리를 만들어 주세요"라고 말하는 역할입니다.

CMake의 핵심 파일은 CMakeLists.txt입니다. 아주 작은 프로젝트라면 다음 정도로 시작할 수 있습니다.

cmake_minimum_required(VERSION 3.20)

project(hello_cpp LANGUAGES CXX)

add_executable(hello main.cpp)
target_compile_features(hello PRIVATE cxx_std_20)

각 줄의 의미를 살펴봅시다.

cmake_minimum_required(VERSION 3.20)은 이 프로젝트를 처리하려면 최소한 CMake 3.20 이상이 필요하다는 뜻입니다.

project(hello_cpp LANGUAGES CXX)는 프로젝트 이름과 사용하는 언어를 지정합니다. CMake에서 C++은 CXX라고 부릅니다.

add_executable(hello main.cpp)는 main.cpp를 컴파일해서 hello라는 실행 파일을 만들겠다는 뜻입니다.

target_compile_features(hello PRIVATE cxx_std_20)은 hello 대상이 C++20 기능을 사용한다는 의미입니다.

이제 프로젝트 폴더 구조가 다음과 같다고 해 봅시다.

hello_cpp/
├── CMakeLists.txt
└── main.cpp

터미널에서 다음 명령을 실행합니다.

cmake -S . -B build
cmake --build build

첫 번째 명령은 현재 폴더의 소스 프로젝트를 읽고 build 폴더에 빌드 파일을 준비합니다. 두 번째 명령은 실제 빌드를 수행합니다.

실행 파일 위치는 운영체제와 생성기(generator)에 따라 조금 다를 수 있습니다. Linux나 macOS에서 Make 또는 Ninja를 사용하면 보통 다음처럼 실행할 수 있습니다.

./build/hello

Windows에서 Visual Studio 생성기를 사용했다면 Debug 구성 아래에 실행 파일이 생길 수 있습니다.

.buildDebughello.exe

처음에는 이 차이가 어색할 수 있습니다. 하지만 핵심은 하나입니다. CMake를 사용하면 프로젝트 구조를 IDE에 직접 묶지 않고도 빌드할 수 있습니다.

VS Code와 CMake Tools

VS Code에는 CMake 기반 프로젝트를 편하게 다루기 위한 CMake Tools 확장이 있습니다. CMake Tools의 Quick Start 기능을 사용하면 기본적인 main.cpp, CMakeLists.txt, CMakePresets.json 같은 파일을 생성해 CMake 프로젝트를 빠르게 시작할 수 있습니다.2

일반적인 흐름은 다음과 같습니다.

  • 빈 폴더를 VS Code에서 엽니다.

  • 명령 팔레트에서 CMake: Quick Start를 실행합니다.

  • 프로젝트 언어로 C++을 선택합니다.

  • 실행 파일 프로젝트를 선택합니다.

  • 사용할 컴파일러 키트, 즉 GCC, Clang, MSVC 중 하나를 선택합니다.

  • Configure, Build, Run을 차례로 실행합니다.

VS Code 하단 상태 표시줄에 CMake 관련 버튼이 보이면 빌드와 실행을 GUI처럼 사용할 수 있습니다. 그래도 처음 몇 번은 터미널 명령으로 직접 빌드해 보는 것을 권합니다. 버튼 뒤에서 무슨 일이 벌어지는지 아는 개발자는 문제가 생겼을 때 훨씬 침착합니다.

CMake를 쓸 때 build 폴더는 보통 Git에 올리지 않습니다. 빌드 결과물과 임시 파일이 들어가기 때문입니다. 프로젝트를 Git으로 관리한다면 .gitignore에 다음 줄을 추가하는 습관을 들이세요.

build/

나중에 파일이 늘어나면 CMakeLists.txt의 add_executable에 소스 파일을 추가하면 됩니다.

add_executable(hello
    main.cpp
    user.cpp
    account.cpp
)

이 구조는 뒤에서 클래스를 파일로 나누고, 라이브러리를 만들고, 테스트 코드를 붙일 때 계속 사용하게 됩니다.

C++ 표준 옵션 이해하기

C++에는 여러 표준 버전이 있습니다. C++98, C++11, C++14, C++17, C++20, C++23처럼 시간이 지나며 언어와 표준 라이브러리가 발전해 왔습니다. 이 책은 C++17/20 감각을 기본으로 삼고, C++23의 흐름은 필요한 곳에서 소개합니다.

컴파일러에게 "어느 버전의 C++을 사용할지" 알려 주는 옵션이 바로 표준 옵션입니다. GCC 문서에서도 C++ 표준 방언은 명령줄 옵션으로 선택할 수 있다고 설명합니다.3

GCC와 Clang에서는 다음처럼 씁니다.

g++ -std=c++20 main.cpp -o hello
clang++ -std=c++20 main.cpp -o hello

C++23 기능을 실험하려면 다음처럼 쓸 수 있습니다.

g++ -std=c++23 main.cpp -o hello
clang++ -std=c++23 main.cpp -o hello

MSVC에서는 다음처럼 씁니다.

cl /std:c++20 /EHsc main.cpp

최신 실험 기능까지 쓰고 싶을 때는 MSVC에서 /std:c++latest를 보게 될 수도 있습니다. 하지만 입문 단계에서는 무작정 최신 옵션을 켜는 것보다, 책의 예제와 컴파일 옵션을 맞추는 것이 중요합니다.

예를 들어 C++20의 std::span이나 Concepts 예제를 작성해 놓고 -std=c++17로 컴파일하면 당연히 오류가 납니다. 반대로 오래된 컴파일러에서 -std=c++23을 지정하면 옵션은 받아들이더라도 일부 라이브러리 기능이 아직 없을 수 있습니다.

따라서 예제를 실행할 때는 다음을 기억하세요.

g++ -std=c++20 -Wall -Wextra -pedantic main.cpp -o app

여기서 -Wall과 -Wextra는 경고를 더 많이 보여 달라는 옵션입니다. 경고는 오류는 아니지만, 미래의 버그가 고개를 내미는 순간일 때가 많습니다. -pedantic은 표준 C++ 관점에서 엄격하게 보겠다는 의미입니다. 처음에는 메시지가 조금 많아 보여도, 좋은 습관을 들이는 데 도움이 됩니다.

MSVC에서는 비슷한 감각으로 다음처럼 사용할 수 있습니다.

cl /std:c++20 /EHsc /W4 main.cpp

/W4는 경고 수준을 높이는 옵션입니다. /EHsc는 C++ 예외 처리 모델을 지정하는 옵션인데, Visual Studio에서 표준적인 C++ 예제를 컴파일할 때 자주 함께 사용합니다.

디버그 빌드와 릴리스 빌드

개발 환경을 준비하다 보면 Debug, Release라는 단어를 자주 봅니다. 처음에는 "둘 다 실행되는데 뭐가 다르지?" 싶을 수 있습니다.

Debug 빌드는 문제를 찾기 쉽게 만든 빌드입니다. 최적화를 거의 하지 않고, 디버거가 사용할 정보를 포함합니다. 그래서 실행 파일이 조금 크고 느릴 수 있지만, 한 줄씩 실행하거나 변수 값을 확인하기 좋습니다.

Release 빌드는 배포나 성능 측정을 위한 빌드입니다. 컴파일러가 코드를 더 빠르게 만들기 위해 최적화를 수행합니다. 대신 디버깅이 어려워질 수 있습니다. 코드 한 줄이 사라진 것처럼 보이거나, 변수 값이 예상과 다르게 표시될 수 있습니다. 컴파일러가 성능을 위해 코드를 재배치했기 때문입니다.

터미널에서 직접 컴파일할 때 Debug 감각은 다음과 같습니다.

g++ -std=c++20 -g -O0 main.cpp -o app_debug

-g는 디버그 정보를 넣고, -O0은 최적화를 끄라는 뜻입니다.

Release 감각은 다음과 같습니다.

g++ -std=c++20 -O2 -DNDEBUG main.cpp -o app

-O2는 실무에서 자주 쓰는 최적화 수준입니다. -DNDEBUG는 디버그용 검사 일부를 끄는 데 사용됩니다.

CMake에서는 보통 다음처럼 빌드 타입을 지정합니다.

cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug
cmake --build build

또는 Release로 빌드합니다.

cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build

단, Visual Studio 같은 멀티 구성 생성기에서는 빌드할 때 구성을 따로 지정하는 경우가 많습니다.

cmake --build build --config Debug
cmake --build build --config Release

처음에는 복잡해 보여도 괜찮습니다. 지금은 "디버깅할 때는 Debug, 성능을 볼 때는 Release" 정도만 기억하면 됩니다.

자주 만나는 문제들

개발 환경을 세팅하다 보면 누구나 비슷한 문제를 만납니다. 이것은 실력이 부족해서가 아닙니다. C++ 도구 체인이 그만큼 여러 층으로 이루어져 있기 때문입니다.

g++ 또는 clang++ 명령을 찾을 수 없다고 나오면 컴파일러 설치 또는 PATH 설정 문제일 가능성이 큽니다. 설치 후 터미널과 VS Code를 다시 열었는지도 확인하세요.

VS Code에서 자동 완성은 되는데 빌드가 안 된다면, C/C++ 확장만 설치하고 컴파일러를 설치하지 않았을 수 있습니다. 확장은 코드를 이해하는 눈을 제공하지만, 코드를 실행 파일로 만드는 손은 컴파일러입니다.

gcc로 C++ 코드를 컴파일하다가 표준 라이브러리 링크 오류가 난다면 g++를 사용해야 합니다. gcc는 주로 C 컴파일에 쓰고, C++에서는 g++ 또는 clang++를 사용하는 습관을 들이세요.

undefined reference 또는 unresolved external symbol이 나오면 링크 오류입니다. 함수 선언만 있고 정의가 빠졌는지, .cpp 파일을 빌드 대상에 포함하지 않았는지, 필요한 라이브러리를 연결하지 않았는지 확인해야 합니다.

CMake에서 이상한 오류가 계속되면 build 폴더를 삭제하고 다시 구성해 보세요. 이전 설정이 남아 있어 새 설정과 충돌하는 경우가 있습니다.

rm -rf build
cmake -S . -B build
cmake --build build

Windows PowerShell에서는 rm -rf 대신 다음을 사용할 수 있습니다.

Remove-Item -Recurse -Force build
cmake -S . -B build
cmake --build build

경로에 공백이나 한글이 있을 때 일부 도구나 오래된 설정이 문제를 일으키는 경우도 있습니다. 요즘 도구는 많이 좋아졌지만, 입문 단계에서는 프로젝트 경로를 단순하게 두는 것이 좋습니다.

C:cpphello_cpp

이런 식의 짧고 단순한 경로는 문제를 줄여 줍니다.

이 장에서 추천하는 기본 환경

선택지가 많으면 자유롭지만, 처음에는 오히려 혼란스럽습니다. 그래서 이 책을 따라오는 동안 다음 중 하나를 고르면 충분합니다.

Windows에서 가장 편하게 시작하고 싶다면 Visual Studio Community를 설치하고 MSVC로 예제를 실행하세요. 디버거가 좋고 설정이 단순합니다.

Windows에서도 크로스플랫폼 감각을 익히고 싶다면 VS Code, C/C++ 확장, CMake Tools, MSYS2/MinGW-w64 또는 LLVM을 조합하세요. 터미널에서 g++ --version 또는 clang++ --version이 동작하는지 꼭 확인해야 합니다.

Linux나 WSL을 사용한다면 GCC, CMake, GDB를 설치하고 VS Code를 연결해 사용하는 방식이 좋습니다. 서버 개발이나 시스템 프로그래밍 감각을 익히기에 좋은 환경입니다.

macOS라면 Xcode Command Line Tools로 Clang을 설치하고, VS Code 또는 Xcode를 사용하면 됩니다. CMake도 함께 설치해 두면 이후 프로젝트 구조를 익힐 때 도움이 됩니다.

어떤 환경을 고르든 이 책의 예제는 가능한 한 표준 C++ 중심으로 작성할 것입니다. 특정 IDE 버튼에 의존하기보다, 소스 파일이 어떻게 컴파일되고 링크되는지 이해하는 쪽으로 진행합니다.

작은 성공을 저장해 두기

마지막으로 이번 장에서 만든 첫 번째 프로그램을 다음 구조로 저장해 둡시다.

hello_cpp/
├── CMakeLists.txt
└── main.cpp

main.cpp는 다음과 같습니다.

#include <iostream>

int main()
{
    std::cout << "Hello, C++!n";
    return 0;
}

CMakeLists.txt는 다음과 같습니다.

cmake_minimum_required(VERSION 3.20)

project(hello_cpp LANGUAGES CXX)

add_executable(hello main.cpp)
target_compile_features(hello PRIVATE cxx_std_20)

터미널에서 다음 명령으로 빌드합니다.

cmake -S . -B build
cmake --build build

그리고 실행합니다.

./build/hello

Windows에서 실행 파일 위치가 다르다면 build 폴더 안을 확인하세요. Visual Studio 생성기를 사용한 경우 다음처럼 실행해야 할 수 있습니다.

.buildDebughello.exe

이제 여러분은 C++ 개발의 출발선에 섰습니다. 단지 "Hello, C++!"을 출력한 것이 아닙니다. 소스 파일을 만들고, 컴파일러를 호출하고, 링크를 거쳐 실행 파일을 만들었습니다. 이 흐름 위에 앞으로 변수, 함수, 클래스, STL, 스마트 포인터, 템플릿이 차례로 올라갑니다.

다음 장에서는 드디어 C++ 기본 문법으로 들어갑니다. 하지만 이제는 문법을 배울 때마다 바로 실행해 볼 수 있습니다. 이것이 이번 장에서 얻은 가장 큰 무기입니다.

참고

1C/C++ for Visual Studio Code

2Create a CMake hello world project with CMake Quick Start

3C++ Standards Support in GCC

책 목록

처음 만나는 C++: 객체지향에서 현대 C++까지

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기