$(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
출처: https://jangpd007.tistory.com/220
https://bowbowbow.tistory.com/12
만약
gcc -c -o main.o main.c
라고 한다면, -c옵션을 object파일을 생성하는 옵션이고, -o옵션은 생성 될 파일 이름을 지정하는 옵션이다. -o을 넣지 않아도 c파일이름.o으로 자동 생성되지만, 실행 파일 생성시 -o 옵션을 넣지 않으면 모든 파일이 a.out 이라는 이름을 가지게 되므로 여러 개의 실행 파일을 생성해야 할 때 효율적인 옵션이다.
-c 소스 파일을 컴파일만 하고 링크를 수행하지 않으며, 오브젝트 파일을 생성한다.
-o 바이너리 형식의 출력 파일 이름을 지정하는데, 지정하지 않으면 a.out라는 기본 이름이 적용된다.
-I 헤더 파일을 검색하는 디렉토리 목록을 추가한다.
-L 라이브러리 파일을 검색하는 디렉토리 목록을 추가한다.
-l 라이브러리 파일을 컴파일 시 링크한다.
형식
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 $@ $^
잘못된 점이 있다면 알려주세요...!