C++ Make 빌드 정리
용어 및 컴파일 개념 정리
컴파일 과정은 전처리 -> 컴파일 -> 링크 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보다 최신인 의존 파일들에 대응 -
$+
$^와 비슷하지만 중복된 파일 이름들까지 모두 포함