● 매크로를 참조 할 때는 소괄호나 중괄호를 둘러써고 앞에 '$'를 붙인다.
● Makefile 내부의 "$(CC)"라는 문자열은 gcc 명령어를 뜻하게 된다.
● 매크로는 반드시 치환 위치보다 먼저 선언되어야 한다.
● 사용자가 정의한 매크로 이외에도 make에서 지원하는 내부매크로(자동 변수) 도 존재한다.
▶ $@ : 현재 타겟의 이름
▶ $* : 현재 타겟의 이름에서 확장자만 제거
▶ $^ : 현재 타겟의 종속 항목의 리스트 (현제 타겟이 의존하는 파일들)
▶ $? : 현재 타겟의 종속 항목중 변경된 것들의 목록
▶ $< : 의존 파일중 첫 번째 파일
▶ $% : 현재 타깃이 라이브러리 모듈일 때 .o 파일에 대응되는 이름
▷ 위 구문에서 target1은 해당 절의 이름을 나타낸다.
▷ make명령어를 실행시킬 때, 'make target1' 를 실행시킨다면, 해당 절의 명령어들이 실행된다.
▷ dependency1, dependency2는 target1을 실행하는데 필요한 재료 파일들 이다.
▷ target1을 실행시키는데 필수 불가결한 파일들로 해당 디렉토리에서 그 파일들을 찾을 수 없다면
make 명령어는 자동으로 makefile 내부에서 목적파일로 dependency1, dependency2를 생성시키는 명령어를 찾아 수행한다.
▷ command1, command2는 명령어 입니다. 'make target1' 명령어를 실행시키면, 컴파일러는 comman1, command2를 순차적으로 실행시킨다.
(1) 컴파일(Compile)
◈ 소스 코드를 컴퓨터가 이해할 수 있는 어셈블리어로 변환하는 과정
◈ -c 옵션: 링크를 하지 않고 컴파일해서 목적 파일(Object File)을 생성하라는 의미
◈ -o 옵션: 생성된 아웃풋 파일의 이름을 지정하는 옵션
◈ 기타 gcc 옵션
-g : 디버그 정보 포함
-L : 헤더 파일의 디렉토리, 즉 -l 로 지정된 라이브러리가 존재하는 위치를 알려준다
-l : 라이브러리 지정, 즉 특정한 라이브러리(.a)를 포함하도록 알려준다
예를 들어, libabc.a 라는 라이브러리 파일을 링크시키려면 -labc 로 옵션을 준다.
-I : 컴파일러가 #include 가 작성된 라인에 있는 헤더파일의 위치를 찾을 수 있게 위치를 알려준다.
일반적으로, C에서 #include <stdio.h> #include "maru.h"
이런식으로 헤더를 사용하는데 < > 안에 사용한 경우는 /usr/include (시스템 표준 헤더 디렉토리) 를 기준으로 찾아서 가지고 오는 것이고
" " 안의 경우는 현재 컴파일러가 실행되는 현재 디렉토리를 기준으로 가지고 오는데 이와 같지 않은 경우에 사용하는 것이 -I 옵션이다.
-Wall: 모든 경고 표시
Werror: 모든 경고를 에러로 처리
(2) 링크(Link)
◈ 서로 다른 파일에 흩어져 있던 함수나 클래스들을 한 데 묶어서 링크해주는 작업
◈ main 함수 안에 foo 함수와 bar 함수가 어디에 정의되어 있는지 위치를 찾고 제대로 함수를 호출할 수 있게 된다
<예시>
$ gcc main.o foo.o bar.o -o a.out
(3) make -p: Makefile 에서 미리 정의된 매크로 확인
AR : 아카이브 관리 프로그램 , 기본값 : ar
AS : 어셈블러 , 기본값 : as
CC : C 컴파일러 , 기본값 : cc
CXX : C++ 컴파일러 , 기본값 : g++
CPP : C 전처리기 , 기본값 : cc -E
LD : 링크 , 기본값 : ld
ARFLAGS : AR 플래그
ASFLAGS : 어셈블러 플래그
CFLAGS : C 컴파일러 플래그
CXXFLAGS : C++ 컴파일러 플래그
CPPFLAGS : C 전처리기 플래그
(4) 아카이브 생성
ar crus [라이브러리 이름] [오브젝트 파일들]
▶ c 옵션: 아카이브 파일이 존재하지 않아도 경고 메시지를 출력하지 않음.
▶ r 옵션: 새로운 오브젝트 파일이면 추가, 기존 파일이면 치환함.
▶ u 옵션: 오브젝트 파일의 타임스탬프를 비교해 새로운 파일일 경우에만 치환함.
▶ s 옵션: ranlib(1)과 마찬가지로 아카이브 인덱스를 생성.