C++ make 빌드 정리
September 2025
용어 및 컴파일 개념 정리
컴파일 과정은 전처리
-> 컴파일
-> 링크
3단계로 이루어짐
-
전처리(Preprocessing)
#inclue
,#define
등과 같은 전처리 지시문 처리 -
컴파일(Compilation)
소스코드 -> 컴퓨터가 이해할 수 있는 명령어로 변환된 목적 코드로 변환
-
링크(Assemble)
링커가(Linker)가 목적 코드를 운영체제의 요건에 맞도록 형태를 수정하는 과정
Make
make는 소프트웨어 개발을 위해 유닉스 계열 운영체제에서 주로 사용되는 빌드 도구
여러 소스 파일들의 의존성을 표준적인 문법으로 정의함으로써 컴파일 과정이 최적화되고 쉬워진다.
ex) 목적파일 생성 -> 실행 파일 생성 2가지 쉘 스크립트가 make로 간단히 처리됨
Makefile
기존 C++의 컴파일은 여러 목적 파일을 생성하고 이의 의존성에 맞게 명령어를 내려야 하는 귀찮음이 있지만 이를 미리 makefile
에 정의하여 쉽게 처리하는 것이 make
프로그램의 핵심이다.
구조
target ... : prerequisites ...
(tab) recipe
...
...
-
target
make
실행할target
-
recipes
주어진
target
을make
할 때, 실행할 명령어들의 나열 (tab
으로 구분) -
prerequisites
주어진
target
을make
할 때, 사용될 파일들의 목록
Makefile 예시
CXX = g++
CXXFLAGS = -std=c++17 -Wall -O2
INCLUDE = -I./include
OBJS = Base.o A_Module.o B_Module.o main.o
Base.o : src/Base.cpp include/Base.h
$(CXX) $(CXXFLAGS) $(INCLUDE) -c src/Base.cpp
A_Module.o : src/A_Module.cpp include/A_Module.h
$(CXX) $(CXXFLAGS) $(INCLUDE) -c src/A_Module.cpp
B_Module.o : src/B_Module.cpp include/B_Module.h
$(CXX) $(CXXFLAGS) $(INCLUDE) -c src/B_Module.cpp
main.o : src/main.cpp include/Base.h include/A_Module.h include/B_Module.h
$(CXX) $(CXXFLAGS) $(INCLUDE) -c src/main.cpp
main : $(OBJS)
$(CXX) $(CXXFLAGS) $(OBJS) -o main.out
clean:
rm -f main.out $(OBJS)
고급 문법
PHONY
.PHONY : clean
clean :
rm -f main.out $(OBJS)
make clean
명령 실행 하기 전에 clean
이라는 파일이 있다면 make clean
이라는 명령이 무시하게 되므로 이를 막기 위해 PHONY
라는 문법이 있다.
패턴 매칭과 빌트인 변수
%.o : %.cpp %.h
$(CXX) $(CXXFLAGSOP) -c $<
prerequisite
부분에만 사용할 수 있는 패턴 매칭 기능
-
%.o
와일드 카드의
*.o
와 같은 기능을 함 -
$@
target
이름에 대응 -
$<
prerequisite
에서 첫 번째 파일에 대응 -
$^
의존 파일 목록 전체에 대응
-
$?
target
보다 최신인 의존 파일들에 대응 -
$+
$^
와 비슷하지만 중복된 파일 이름들까지 모두 포함