ADONE 코딩하기
[c언어] 리눅스 make 명령 본문
[참고] https://velog.io/@hidaehyunlee/Makefile-%EB%A7%8C%EB%93%A4%EA%B8%B0
https://www.tuwlab.com/ece/27193
1. C 프로그램 빌드 절차
코드작성 -> 컴파일(object 코드 생성) -> 링크 ( object 파일 묶음) => 실행파일 생성
1-1 컴파일
gcc -c - o main.o main.c
옵션 -c : 컴파일만 실행하여 object 파일을 생성함
옵션 -o : 생성할 파일의 이름을 명시함. (main.o)
1-2 링크
사전에 생성한 object 파일들을 하나로 합쳐 실행 파일을 생성
사전에 만든 파일 : a.o b.o main.o
gcc -o a.out main.o a.o b.o
-o 옵션으로 실행파일명을 명시하고 링크할 파일들을 뒤에 열거함.
2. make 명령
C프로그램을 실행시키거나 업데이트를 할 때 (컴파일 + 링크) 과정이 1 에서 보았듯 복잡하기 때문에 빌드하는 과정을 단축화 하기 위해서 make 명령을 사용함.
make 명령의 특징
Incremental build 기능: 반복적으로 빌드하는 과정에서 변경된 소스코드를 빌드하게 될 때 연관된 소스코드들만 간추려서 빌드하는 기능 (의존성_dependency)
=> 프로그램을 빌드할 때 마다 변경점이 없는 소스파일들까지 전부 빌드하게되면 빌드 중 오류를 잡기도 복잡해지고 시간도 오래 걸리므로 의존성에 따라서 빌드하는 것이 작업 효율이 좋음.
2-1 make 명령 설정
- vi Makefile (makefile로 해도되지만, Makefile 권고) 를 통해 makefile 생성
- makefile 작성
make
또는
make a.o
처럼 특정 파일만 빌드하거나 전체 파일들을 make명령으로 빌드
2-2 makefile 작성 방법
<Target> : <Dependencies>
<Recipes>
//example
a.out : main.o a.o b.o
gcc -o a.out main.o a.o b.o
Target = 빌드할 대상, 최종적으로 생성되는 파일의 이름
Dependencies = Target이 의존하는 파일 목록, Target 보다 먼저 생성되어야 할 파일 목록
Recipes = 빌드 대상을 생성하는 명령
2-3 makefile 변수
내장 변수로 (CC, CFLAGS, TARGET, OBJS 등)과
자동 변수 (@, < 등)를 사용해서 을 사용해 코드를 간략화 함.
(exmaple _ 기본 패턴)
//Makefile
CC=gcc
CFLAGS=-g -Wall
LDFLAGS=<링크 옵션>
LDLIBS=<링크 라이브러리 목록>
TARGET=a.out
OBJS=main.o a.o b.o
$(TARGET) : $(OBJS)
$(CC) -o $@ $(OBJS)
a.o : a.c
%(CC) -c -o a.o a.c
b.o : b.c
%(CC) -c -o b.o b.c
main.o : main.c
%(CC) -c -o main.o main.c
clean:
rm $(TARGET) $(OBJS)
- $@ : 현재 TARGET
- $^ : 현재 TARGET이 의존하는 대상들의 목록
- $? : 현재 TARGET이 의존하는 대상들 변경된 것들의 목록
- $% : TARGET의 이름 (TARGET이 아카이브인 경우
gcc 컴파일 옵션 (CFLAGS 변수에 들어갈 옵션) 정리 링크
https://dany-it.tistory.com/213
'C언어' 카테고리의 다른 글
[C언어] 코드 분석 중 발견한 함수들 (1) | 2023.03.01 |
---|---|
[C언어] #include 정보 (0) | 2023.02.11 |