[C++/Build] Makefile - 빌드 자동화
Makefile은 리눅스 플랫폼에서 제공하는 빌드 자동화 유틸리티입니다. make 유틸리티는 프로그래밍언어처럼 그 안에서 사용되는 작은 규모의 문법이 있습니다. 변수를 정의할 수 있고, 몇 가지 유용한 함수도 제공합니다.
CC = g++ CFLAGS = -lpcap TARGET = arp_spoof RM = rm -f SOURCE_DIR = src INCLUDE_DIR = include BINARY_DIR = bin default: $(TARGET) all: default OBJECTS = $(patsubst %.cpp, %.o, $(wildcard $(SOURCE_DIR)/*.cpp)) HEADERS = $(wildcard $(INCLUDE_DIR)/*.h) $(TARGET): $(OBJECTS) @mkdir -p $(BINARY_DIR) @echo "[+] Make Binary File" $(CC) -g -c -o $(BINARY_DIR)/$@ $< $(CFLAGS) %.o: %.cpp $(HEADERS) @echo "[+] Compile @< File" $(CC) -g -c -o $@ $< -I$(INCLUDE_DIR) clean: $(RM) $(SOURCE_DIR)/*.o $(RM) $(BINARY_DIR)/$(TARGET) @rmdir $(BINARY_DIR) 2>/dev/null
- 변수 = 값 // 위의 예제에서 'CC = g++'은 CC 변수에 g++ 값을 대입한 것입니다. 변수를 사용할 때는 '$(변수)'로 접근합니다.
- 하단에 보시면 %.o: %.cpp 구문이 있는데 여기서 %는 어떠한 문자열이든 상관없다는 뜻입니다. 예를 들어, 입력 파일로 'main.cpp', 'sub.cpp' 2가지 cpp 파일이 필요하다면 입력 구문에 main.cpp sub.cpp라 적을 필요없이 %.cpp라 적으면 간단히 끝납니다.
- '$@'은 출력 파일을 지칭하는 일종의 매크로 변수입니다.
'$<'은 입력 파일을 지칭하는 일종의 매크로 변수입니다.
make 유틸리티에서 제공하는 몇 가지 유용한 함수를 살펴보겠습니다.
- subst
- wildcard
- patsubst
- notdir
subst
usage: $(subst from, to, text)
이 함수는 'text'라는 문자열 중에서 'from'에 해당하는 문자열을 'to'로 치환합니다.
wildcard
usage: $(wildcard pattern)
이 함수는 패턴과 일치하는 파일들의 경로를 얻는데 사용합니다.
예를 들어, $(wildcard ../target/*.c) 라고 적으면
../target/main.c
../target/source.c
처럼 패턴과 일치하는 모든 파일들을 가리킵니다.
patsubst
usage: $(patsubst pattern, replacement, text)
이 함수는 'text'라는 문자열 중에서 'pattern'에 맞는 패턴 문자열을 'replacement' 패턴 문자열로 대체합니다.
예를 들어, $(patsubst %.c, %.o, foo.c.c bar.c) 라고 적으면
'foo.c.c bar.c' -> 'foo.c.o bar.o' 로 문자열이 바뀝니다.
notdir
usage: $(notdir names...)
이 함수는 나열된 문자열 중에서 '파일 경로'를 제거한 '파일명'만 출력합니다.
'Programming > C C++' 카테고리의 다른 글
[문법] 2차원 배열을 함수의 매개변수로 사용하기 (0) | 2019.09.21 |
---|---|
[C++/Build] 빌드 자동화를 위한 make 유틸리티 (0) | 2019.06.17 |
[C++ STL] '정렬 알고리즘(sort algorithm)' (0) | 2019.06.03 |
[C++ STL] '탐색 알고리즘(search algorithm)' (0) | 2019.05.29 |
[C++ STL] '연관 컨테이너 - map' (0) | 2019.05.29 |
댓글
이 글 공유하기
다른 글
-
[문법] 2차원 배열을 함수의 매개변수로 사용하기
[문법] 2차원 배열을 함수의 매개변수로 사용하기
2019.09.212차원 배열을 사용하기 위해서 아무 생각없이 아래와 같이 사용했다가 문법 에러가 발생했다. int func(int* parameter[]) { // somthing else…. } 위 표현과 동일한 표현은 첨자를 두 번 연달아 사용한 경우다. int func(int parameter[][]) { // somthing else…. } 위와 같은 방식이 왜 안되는지 찾아보고 가만히 생각해보니까 안되는게 당연하다. 이유는 포인터가 주소 연산을 하기 위해선 자신이 가리키는 대상에 크기가 정해져있어야 하는데 위와 같이 쓰면 포인터가 가리키는 대상이 int[] 배열이 되므로 크기를 알 수 없다. 1차원 포인터를 예를 들면 int func(int* parameter) { // somthing else…. } 위… -
[C++/Build] 빌드 자동화를 위한 make 유틸리티
[C++/Build] 빌드 자동화를 위한 make 유틸리티
2019.06.17공식 레퍼런스: https://www.gnu.org/software/make/manual/make.html GNU에서 제공하는 make 유틸리티는 빌드 자동화를 위한 툴입니다. 레퍼런스를 보면 컴파일러를 가진 어떤 언어든 상관없이 쉘 스크립트를 통해 자동화가 가능하며, 프로그램 빌드뿐만 아니라 파일의 업데이트 여부와 같은 변화도 체크할 수 있다고 합니다. 하지만 일반적으로 C/C++ 언어의 빌드 자동화를 위한 툴로 많이 사용됩니다. make 유틸리티는 파일들 사이의 관계와 용도(헤더 파일을 어떻게 링크시키고 어떤 식으로 컴파일할지)를 makefile에 정의해두면 어떤 환경에서든 동일한 빌드가 가능하게 해줍니다. 즉, makefile을 작성하는 방법만 알면 GNU에서 제공해주는 유용한 빌드 자동화 툴인 m… -
[C++ STL] '정렬 알고리즘(sort algorithm)'
[C++ STL] '정렬 알고리즘(sort algorithm)'
2019.06.03'컨테이너'를 사용하면서 그 안에 든 원소들을 자신이 원하는 기준으로 정렬시키고 싶을 때가 있을텐데, 이 때 '정렬 알고리즘'을 사용하시면 됩니다. 먼저, 어떤 것들이 있는지 표로 나열해보겠습니다. 정렬 알고리즘(sort algorithm) 설명(p는 구간의 반복자) p = partition(b, e, f) 구간 [b, e)의 원소들 중 f(*p)가 참인 원소는 [b, p)에 나열하고, 거짓인 원소는 [p, e)에 나열합니다. stable_partition(b, e, f) 위의 함수와 같은 기능을 하고, 추가적으로 원소들을 조건에 따른 참, 거짓으로 분류할 때 기존의 순서를 유지시켜줍니다. sort(b, e) 구간 [b, e)의 원소들을 퀵 정렬을 기준으로 정렬합니다. sort(b, e, f) 위의 알고… -
[C++ STL] '탐색 알고리즘(search algorithm)'
[C++ STL] '탐색 알고리즘(search algorithm)'
2019.05.29C++ STL에서 제공하는 컨테이너에는 기본적인 기능을 담은 멤버 함수가 있습니다. 그리고 그것과는 별개로, STL에선 알고리즘(algorithm)을 제공합니다. STL algorithm은 algorithm 헤더 파일을 통해 사용할 수 있습니다. 알고리즘과 컨테이너간의 관계를 그림으로 표현하면 다음과 같습니다. 위의 그림에서 보시는 것처럼 '알고리즘'이라는건 '컨테이너'에 들어있는 원소들을 조작할 수 있는 함수들의 모임이라고 생각하시면 됩니다. '컨테이너'에 들어있는 원소들을 어떤 기준을 가지고 정렬시키고 싶을 수도 있을 것이고, '컨테이너'에 들어있는 원소 집합 중에서 특정한 값이 들어있는지 찾고싶을 때도 있을 것이고, 어떤 조건에 해당하는 원소들을 집합에서 제거시키고 싶을 수도 있을 것이고, '컨테이…
댓글을 사용할 수 없습니다.