Embedded Linux

Makefile 작성하기

작성자 임베디드코리아 작성일24-11-29 22:12 조회639회 댓글0건
1. 매크로 정의 (변수 정의)
        CC = gcc

  ● 매크로를 참조 할 때는 소괄호나 중괄호를 둘러써고 앞에 '$'를 붙인다.
  ● Makefile 내부의 "$(CC)"라는 문자열은 gcc 명령어를 뜻하게 된다.
  ● 매크로는 반드시 치환 위치보다 먼저 선언되어야 한다.
  ● 사용자가 정의한 매크로 이외에도 make에서 지원하는 내부매크로(자동 변수) 도 존재한다.
      ▶ $@ : 현재 타겟의 이름
      ▶ $* : 현재 타겟의 이름에서 확장자만 제거
      ▶ $^ : 현재 타겟의 종속 항목의 리스트 (현제 타겟이 의존하는 파일들)
      ▶ $? : 현재 타겟의 종속 항목중 변경된 것들의 목록
      ▶ $< : 의존 파일중 첫 번째 파일
      ▶ $% : 현재 타깃이 라이브러리 모듈일 때 .o 파일에 대응되는 이름

2.타겟절

    target1 : dependency1 dependency2
            command1
            command2

        ▷ 위 구문에서 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 -c -o main.o main.c
$gcc -c -o foo.o foo.c
$gcc -c -o bar.o bar.c

◈ 기타 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)과 마찬가지로 아카이브 인덱스를 생성.