C & C++/C in Linux

[C in Linux] Makefile

  • -
728x90

Makefile이란?

Linux상에서 반복적으로 발생하는 컴파일을 쉽게하기위해서 사용하는 make프로그램의 설정 파일.

Makefile을 통해 라이브러리 및 컴파일러 환경을 관리할 수 있다.  

Incremental build를 사용하기 위함.

Incremental build란?

반복적인 빌드 과정에서 변경된 소스코드에 의존성(Dependency)이 있는 대상들만 추려서 다시 빌드하는 기능이다.

예를 들어, 위의 빌드 예제에서 main.c의 한 줄만 바꾸고 다시 빌드할 때, 컴파일과 링크만 수행하는 경우가 이에 해당한다.  

 

Makefile의 기본 구조

파일명 : Makefile

Makefile은 Target(대상), 의존 관계(Dependency), 명령(Recipe/Command)의 세가지로 아루어진다.

 

 - Target : 빌드 대상 이름, 명령에 의해 생성되는 결과 파일, 오브젝트 파일이나 실행 파일

 - Dependency : 대상을 만들 때 의존되는 파일들, 이곳에 나열된 대상들을 먼저 만들고 빌드 대상을 생성한다. 의존 파일이 변경됐다면 대상을 만들도록 명령을 내릴 것이다.

 - Command : 빌드 대상을 생성하는 명령, 여러줄로 작성할수 있으며, 의존 관계에 있는 파일들이 변경됐거나 대상 파일이 없을 때 명령이 실행된다. 쉘에서 쓸 수 있는 명령을 사용할 수 있다.

 

Makefile 매크로

Makefile에서 미리 정의된 매크로 확인 방법 : make -p

매크로 이름 설명 기본값
AR 아카이브 관리 프로그램  ar
AS 어셈블러 as
CC C Compiler cc
CXX C++ Compiler g++
CPP C 전처리기 cc -E
LD 링크 ld
MAKEINFO Texinfo 파일을 Info 파일로 변환 makeinfo
TEX TeX문서로부터 TeX DVI 생성 tex
TEXI2DVI Texinfo 파일을 dvi파일로 변환 texi2dvi
ARFLAGS ar플래그  
ASFLAGS 어셈블러 플래그  
CFLAGS C 컴파일러 플래그  
CXXFLAGS C++ 컴파일러 플래그  
CPPFLAGS C 전처리기 플래그  
make 내부적으로는 정의되어있지만, make -p로 확인할 수 없는 자동 매크로
$? 현재 타겟보다 최근에 변경된 종속 항목 리스트(확장자 규칙에서 사용 불가)
$^ 현재 타겟의 종속 항목 리스트(확장자 규칙에서 사용 불가)
$@ 현재 타겟의 이름
$< 현재 타겟보다 최근에 변경된 종속 항목 리스트(확장자 규칙에서만 사용 가능)
$* 현재 타겟보다 최근에 변경된 종속 항목의 이름(확장자 제외/ 확장자 규칙에서만 사용 가능)
$% 현재 타깃이 라이브러리 모듈일 때 .o 파일에 대응되는 이름

 

아카이브를 생성할 경우 :: ar rcus [라이브러리 이름] [오브젝트 파일들]

r 옵션 :: 새로운 오브젝트 파일이면 추가, 기존 파일이면 치환함.

c 옵션 :: 아카이브 파일이 존재하지 않아도 경고 메시지를 출력하지 않음.

u 옵션 :: 오브젝트 파일의 타임스탬프를 비교해 새로운 파일일 경우에만 치환함.

s 옵션 :: ranlib(1)과 마찬가지로 아카이브 인덱스를 생성.

→ 아카이브 인덱스를 생성하지 않으면 링크 속도가 느려지고, 시스템 환경에 따라서는 에러가 발생.

(※ 아카이브 인덱스는 nm -s로 조회할 수 있다.)



출처: https://devanix.tistory.com/195 [┗System∑Sec†ion┛]

참조
 - https://doitnow-man.tistory.com/100
 - https://velog.io/@hidaehyunlee/Makefile-%EB%A7%8C%EB%93%A4%EA%B8%B0
 - https://m.blog.naver.com/muri1004/220025207766
728x90
300x250
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.