Skip to content

터미널에서 컴파일 및 실행

Visual Studio 같은 기존의 통합 개발 환경(IDE)에서는 Ctrl + F5 등 단축키 한 번으로 컴파일과 실행이 동시에 이루어졌습니다. 하지만 Linux 기반 터미널 환경에서는 소스 코드를 컴파일하는 명령어결과물인 실행 파일을 실행하는 명령어를 각각 분리해서 사용하게 됩니다. 처음에는 번거롭게 느껴질 수 있지만, 이 방식은 컴파일 옵션을 자유롭게 조정하거나 입출력 리다이렉션 등의 강력한 기능을 사용할 수 있게 해줍니다.

C++ 소스 코드 준비

터미널에서 실습 환경 세팅 (mkdir, touch, code .)

문제를 풀 때는 보통 문제 번호나 이름으로 된 폴더를 만들고, 그 안에서 작업하는 것이 깔끔합니다. 터미널을 열고 다음 명령어들을 차례대로 입력해 보세요.

bash
mkdir ioipractice
cd ioipractice
touch main.cpp
code .

이 명령어들은 ioipractice이라는 새로운 폴더를 만들고, 그 폴더 안으로 이동한 뒤 main.cpp라는 빈 파일을 생성합니다. 마지막으로 code .을 입력하면 현재 폴더(ioipractice)를 기준으로 VS Code가 열리게 됩니다.

VS Code에서 코드 작성 및 저장

VS Code가 열리면 좌측 탐색기(Explorer)에서 방금 만든 main.cpp 파일을 더블 클릭하여 엽니다. 파일에 평소처럼 C++ 코드를 작성한 뒤, Ctrl + S를 눌러 저장합니다. 코드는 반드시 저장해야만 이후 터미널에서 컴파일할 때 변경 사항이 반영됩니다.

g++를 이용한 컴파일

기본 컴파일 명령어 사용 (g++) 및 옵션 안내

코드를 작성하고 저장했다면, 터미널로 돌아와(혹은 VS Code 내부의 통합 터미널을 열어) 소스 코드를 컴파일할 차례입니다. Ubuntu에서는 기본적으로 C++ 컴파일을 위해 g++ 명령어를 사용합니다.

bash
g++ main.cpp -std=gnu++20 -O2 -pipe -Wall -o main

이 명령어는 main.cpp 파일을 컴파일하여 main이라는 이름의 실행 파일을 만들어냅니다. 각 옵션이 어떤 역할을 하는지 간단히 알아보겠습니다.

  • -std=gnu++20: C++20 표준에 GNU 확장을 더한 버전을 사용하겠다는 뜻입니다. 최근 문제 풀이 플랫폼에서 주로 지원하는 표준입니다.
  • -O2: 코드를 최적화(Optimization)하여 프로그램이 더 빠르게 실행되도록 합니다.
  • -pipe: 컴파일 과정에서 임시 파일을 생성하지 않고 파이프(메모리)를 사용하여 컴파일 속도를 높여줍니다.
  • -Wall: 코드에 잠재적인 문제가 있을 경우 다양한 경고(Warning) 메시지를 출력해 줍니다.
  • -o main: 컴파일 결과물(실행 파일)의 이름을 main으로 지정합니다. 이 옵션이 없으면 기본적으로 a.out이라는 이름으로 생성됩니다.

일반적으로 -O2 옵션이나 -pipe 옵션은 온라인 저지에서 자동으로 붙여서 컴파일해주기 때문에, 실제로 로컬 환경에서 테스트할 때는 몇 가지 플래그를 생략해도 무방합니다.

컴파일이 성공적으로 완료되었다면 아무런 메시지도 출력되지 않고 터미널 입력 줄이 다시 나타납니다.

프로그램 실행

현재 디렉토리의 실행 파일 실행 (./)

컴파일이 성공적으로 끝나면 터미널에 ls 명령어를 입력해 보세요. 소스 코드인 main.cpp 외에 main이라는 실행 파일이 새롭게 생성된 것을 볼 수 있습니다. 이 프로그램을 실행하려면 다음과 같이 입력합니다.

bash
./main

리눅스 계열 운영체제에서는 보안상의 이유로 현재 폴더에 있는 파일을 파일명만으로 바로 실행할 수 없습니다. 대신 현재 폴더를 의미하는 ./를 앞에 붙여 **"현재 폴더에 있는 main을 실행해라"**라고 명시적으로 지시해야 합니다.

입출력 리다이렉션 (Redirection) 활용

터미널 기본 입출력

./main을 입력하여 프로그램을 실행하면, 기본적으로 키보드로 값을 입력하고 모니터(터미널 창)로 결과를 출력하게 됩니다. 간단한 예제는 이렇게 직접 입력하며 테스트해도 충분합니다.

입력 리다이렉션: 예제 입력을 input.txt로 넘겨주기 (<)

입력 데이터가 길거나 테스트 케이스가 복잡할 경우, 매번 프로그램 실행 후 복사/붙여넣기를 하는 것은 매우 번거롭습니다. 대신 예제 입력을 파일로 저장해 두고, 그 내용을 프로그램의 입력으로 넘겨줄 수 있습니다.

VS Code에서 input.txt 파일을 생성하고 예제 입력을 복사해 넣습니다. 그런 다음 터미널에서 다음과 같이 실행합니다.

bash
./main < input.txt

< 기호는 "방향"을 의미합니다. 즉, input.txt 파일의 내용을 ./main 프로그램의 키보드 입력(Standard Input)인 것처럼 밀어 넣어(Redirect) 실행하라는 뜻입니다. 기존의 문제풀이 환경처럼 코드 내부에 freopen 등을 작성할 필요 없이, 표준 입출력 코드(cin, scanf 등)를 그대로 둔 채 터미널 명령어만으로 파일 입력을 받을 수 있습니다.

출력 리다이렉션: 실행 결과를 파일로 저장하기 (>)

마찬가지로 출력을 파일로 저장할 수 있습니다.

bash
./main > output.txt

> 기호는 프로그램이 화면에 출력할 내용(Standard Output)을 모니터 대신 output.txt 파일에 저장하라는 뜻입니다.

입력과 출력 리다이렉션을 동시에 사용할 수도 있습니다.

bash
./main < input.txt > output.txt

이렇게 하면 input.txt의 데이터를 읽어들여 프로그램을 실행한 후, 그 모든 결과를 화면에 띄우는 대신 output.txt 파일에 기록하게 됩니다.