일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- MySQL
- Data Structure
- mongoDB
- JPA
- JavaScript
- Java
- Kafka
- MSA
- Algorithm
- 알고리즘
- Galera Cluster
- C
- react
- Proxy
- Heap
- 컴퓨터구조
- 운영체제
- design pattern
- redis
- 네트워크
- 파이썬
- 자바
- 자료구조
- Spring
- OS
- IT
- c언어
- 디자인 패턴
- 백준
- spring webflux
Archives
- Today
- Total
시냅스
Makefile : 컴파일을 쉽게 하자! 본문
Makefile에 앞서...
컴파일 단계
1. Preprocessor (전처리 단계)
- 전처리기가 전처리기 지시자(헤더, 매크로)를 처리한다.
- 소스코드를 담고있는 c파일로부터 i를 생성한다. .c -> .i
2. Compiler (컴파일 단계)
- 전처리된 파일에서 .i -> .s를 생성한다.
- .s 파일은 어셈블리어 코드로 이루어져 있다.
3. Assembler (어셈블 단계)
- .s -> 기계어로 이루어진 .o 생성
4. Linking (링킹 단계)
- .o (object) 파일은 라이브러리 함수가 없기 떄문에 라이브러리와 .o 파일을 링킹하여 .exe 파일을 생성한다.
Makefile
Makefile을 통해 컴파일 단계들을 대량으로 제어하거나, 처리하기 쉽게 할 수 있다.
중요한 키워드는 Incremental build로, 간략하면 중복처리나 최신화에 용이하다는 것이다.
에 자세한 설명이 되어있다.
규칙 및 패턴
목표 파일 (target) : 의존성 (dependencies)
레시피 (recipe)
# e.g.
target : target.c
gcc target.c
# 변수
CC=<컴파일러>
CFLAGS=<컴파일 옵션>
LDFLAGS=<링크 옵션>
LDLIBS=<링크 라이브러리 목록>
OBJS=<Object 파일 목록>
TARGET=<빌드 대상 이름>
# 매크로
all: $(TARGET)
clean:
rm -f *.o
rm -f $(TARGET)
$(TARGET): $(OBJS)
$(CC) -o $@ $(OBJS)
자동 변수
Makefile에 내장되어 있는 변수
- $@ : target 의 파일 이름
- $< : 첫 번째 의존성의 파일 이름
- $? : 목표 파일 이전에 갱신된 모든 의존성 파일 이름
- $^ : 모든 의존성의 파일 이름
내장 함수
dir : 디렉토리 부분을 추출
$(dir src/memo main)
# src/ ./
notdir : 디렉토리 아닌 부분을 추출
$(notdir src/memo main)
# memo main
suffix : 접미사(확장자)를 추출
$(suffix .c, memo.c main.c)
# memo main
basename : 접미사를 제외한 부분을 추출
$(notdir src/memo.c main)
# src/memo main
addsuffix : 접미사를 각 이름 끝에 더한다.
$(addsufix .c, memo main)
# memo.c main.c
addprefix : 접두사를 이름 앞에 더한다.
$(addprefix src/, memo main)
# src/memo src/main.c
Phony target
실제 파일 명과 매크로와의 충돌을 막아주거나 성능 개선에 도움을 줄 수 있다.
.PHONY: clean
clean:
rm *.o temp
https://www.gnu.org/software/make/manual/make.html#Phony-Targets
'C' 카테고리의 다른 글
C언어 Struct : 구조체, 구조체 포인터, 구조체 메모리 (0) | 2022.03.20 |
---|---|
C언어 restrict 포인터, static 키워드 (0) | 2022.03.12 |
C언어 파일 모드 정리 (0) | 2022.01.01 |
C언어 string 관련 함수 정리 (0) | 2021.12.29 |
C언어 Pointer 총 정리 (0) | 2021.12.26 |
Comments