알아두면 편한 Makefile

chanykim·2021년 6월 30일
0

알두편

목록 보기
1/2

매크로 치환

$(MACRO_NAME:OLD=NEW)과 같은 형식을 사용.

MY_NAME = chanyoungkim
CADET_NAME = $(MY_NAME:chanyoung=chany)
예제를 보면 chanyoung이란 부분이 chany로 바뀌게 된다. 즉 CADET_NAME의 매크로의 값은 chanykim이 된다.

이것을 makefile로 본다면,

SRCS = main.c intra.c oasis.c
OBJS = $(SRCS:.c=.o)

이렇게 작성할 수 있다.
SRCS .c가 .o로 바뀌게 된다. 즉 아래와 같다.
OBJS = main.o intra.o oasis.o

gcc 컴파일

출처: https://jangpd007.tistory.com/220
https://bowbowbow.tistory.com/12

  1. gcc 파일명(*.c) : Default로 out 파일이 생성된다. (ex a.out)
  2. gcc -c 파일명(*.c) : 오브젝트 파일을 생성한다.
  3. gcc -c 오브젝트파일명(.o) 파일명(.c)
    gcc -o 실행파일명(*.out) 오브젝트
    파일명(*.o)
  4. gcc -o 실행파일 파일명(*.c) : 실행 파일을 만든다. (3번을 한줄로 표현)

만약
gcc -c -o main.o main.c
라고 한다면, -c옵션을 object파일을 생성하는 옵션이고, -o옵션은 생성 될 파일 이름을 지정하는 옵션이다. -o을 넣지 않아도 c파일이름.o으로 자동 생성되지만, 실행 파일 생성시 -o 옵션을 넣지 않으면 모든 파일이 a.out 이라는 이름을 가지게 되므로 여러 개의 실행 파일을 생성해야 할 때 효율적인 옵션이다.

gcc 옵션

출처: https://seamless.tistory.com/2

-c 소스 파일을 컴파일만 하고 링크를 수행하지 않으며, 오브젝트 파일을 생성한다.
-o 바이너리 형식의 출력 파일 이름을 지정하는데, 지정하지 않으면 a.out라는 기본 이름이 적용된다.
-I 헤더 파일을 검색하는 디렉토리 목록을 추가한다.
-L 라이브러리 파일을 검색하는 디렉토리 목록을 추가한다.
-l 라이브러리 파일을 컴파일 시 링크한다.

makefile 내부구조

형식

target : dependency
	 command
-----------------------------------------
$(TARGET) : $(OBJECTS)
$(CC) -o $(TARGET) $(OBJECTS)

자동변수

(출처: https://www.oreilly.com/library/view/managing-projects-with/0596006101/ch02.html)
$@ : 대상을 나타내는 파일 이름입니다.

$% : 아카이브 멤버 지정의 파일 이름 요소입니다.

$< : 첫 번째 전제 조건의 파일 이름입니다.

$? : 대상보다 새로운 모든 필수 구성 요소의 이름으로, 공백으로 구분됩니다.

$^ : 공백으로 구분 된 모든 필수 구성 요소의 파일 이름입니다. 이 목록에는 컴파일, 복사 등과 같은 대부분의 용도에 대해 중복 된 파일 이름이 제거되어 있기 때문에 중복이 필요하지 않습니다.

$+ : $^와 마찬가지로 공백으로 구분 된 모든 선행 조건의 이름입니다. 단, $+에는 중복이 포함됩니다. 이 변수는 중복 값이 의미를 갖는 링커에 대한 인수와 같은 특정 상황에 대해 작성되었습니다.

$* : 대상 파일 이름의 줄기입니다. 줄기는 일반적으로 접미사가없는 파일 이름입니다. 패턴 규칙 외의 사용은 권장하지 않습니다.

만들어지는 과정

.c파일을 .o파일로 만들고 .o파일들을 묶어서 컴파일해서 타겟이름으로 만든다.

OBJ = $(SRC:.c=.o)

$(NAME) : $(OBJ)
	$(CXX) $(CXXFLAGS) -o $@ $^

잘못된 점이 있다면 알려주세요...!

profile
오늘보다 더 나은 내일

0개의 댓글