본문 바로가기

Embeded C

5_4 리눅스 make 명령어


 앞에선 함수의 분리와 결합에 대헤서 알아보았는데 함수를 결합하는 방법은 한가지가 더있습니다. make 명령어를 사용하면 됩니다

 하나의 프로젝트를 효율적으로 관리하고 일관성있게 관리하기 위하여 Makefile 이라는 형식을 사용하고 make 라는 유틸리티를 사용합니다.

 리눅스에서 [소스형태]로 되어 있는 것을 가져와서 컴파일하게 되면 보통 마지막에는 make 라는 명령, 또는 make <___> 이런 식으로 치게 됩니다.

 make 라는 유틸리티는 보통 현재 디렉토리에 Makefile 또는 makefile 이라는 일정한 규칙을 준수하여 만든 화일의 내용을 읽어서 목표 화일(target)을 만들어냅니다. Makefile의 이름을 다르게 명시하고 싶을 때는 다음과 같이 합니다.

      linux) make -f Makefile.linux

 보통 [멀티플랫폼용 소스]들은 Makefile.solaris, Makefile.freebsd, Makefile.hp 이런 식으로 Makefile 을 여러 개 만들어두는 경향이 있고 또는 적절하게 만들어두어 다음과 같이 make <플랫폼> 라는 식으로 하면 컴파일되도록 하기도 합니다.

      linux) make linux

 다른 사람에게 공개하는 소스라면 더욱 make 를 사용해야 합니다. 그들뿐 아니라 자신도 make 라고만 치면 원하는 결과가 나올 수 있도록 하는 것이 좋습니다. 많은 소스를 작성하다 보면  스스로도 까먹기 쉽습니다.

그럼 Makefile을 만들어 보겠습니다

1) linux) gcc -o main main.c test.c

앞에 설명한 함수의 결합입니다. 여기 main 라는 실행화일은 main.c, test.c 라는 2 개의 소스로부터 만들어지고 있습니다.

먼저 vi Makefile 해서 만듭니다.

linux) vi Makefile

vi 편집기에서 아래의 내용을 작성합니다

main:   main.o test.o
        gcc -o main main.o test.o

main.o: main.c
        gcc -c main.c

test.o: test.c
        gcc -c test.c

형식은 다음과 같습니다.

목표:  목표를 만드는데 필요한 구성요소들...
        목표를 달성하기 위한 명령 1
        목표를 달성하기 위한 명령 2
        ...

Makefile은 약간의 오타에도 에러가 발생합니다


 첫번째 목표인 main 를 살펴보죠. 첫 칸에 main: 라고 입력하고 나서 main가 만들어지기 위해서 필요한 구성요소를 적어줍니다. main가 만들어지기 위해서는 컴파일된 main.o, test.o 가 필요합니다.(이건 앞에서 자세히 설명하였습니다) 각 요소를 구분하는데 있어 콤마(,) 같은 건 사용하지 않고 공백으로 합니다.

 중요한것은 다음 줄로 넘어가서는 <tab>키를 누르는 것입니다. 꼭 한 번 이상은 눌러야 합니다. 스페이스키나 다른 키는 사용해선 안됩니다. 목표 화일을 만들어내기 위한 명령에 해당하는 줄들은 모두 <tab>키로 시작해야 합니다. Makefile 만들기에서 제일 중요한 내용입니다. <tab>키를 사용해야 한다는 사실, 바로 이것이 중요한 사실입니다.

main를 만들기 위한 명령은

linux)gcc -o main main.o test.o 입니다

참고>>
main.o는 이렇게 만들면 됩니다
main.o: main.c
        gcc -c main.c

test.o 역시 마찬가지입니다


그후

Makefile을 위처럼 만들어두고 작성하면

        linux) make 또는 make main
        gcc -c main.c
        gcc -c test.c
        gcc -o main main.o test.o

위와 같은 순서로 명령어가 실행됩니다.

        linux) ./main
        “시작”“안녕하세요”“안녕”“하이”“끝”

다시 한 번 실행해볼까요?

        linux) make
        make: `main' is up to date.

make는 main를 다시 만들 필요가 없다고 생각하고 더 이상 처리하지 않습니다.

이번에는 main.c 를 약간만 고쳐봅니다. return 0; 라는 문장을 exit (0); 라는문장으로 바꾸어보죠. 그리고 다시 한 번 다음과 같이 합니다.

        linux) make
        gcc -c main.c
        gcc -o main main.o test.o

당연히 main.c 만 변화되었으므로 main.o 를 만들고 main.o가 갱신되었으므로 main도 다시 만듭니다. 하지만 test.c는 아무변화를 겪지 않았으므로 이미 만들어둔 test.o 는 그대로 둡니다.

        linux) rm -f main (main 삭제)
        
linux) make
        gcc -o main main.o test.o

 main 실행화일만 살짝 지웠더니 make는 알아서 이미 있는 main.o, test.o 를 가지고 main 를 만들어냅니다. :)

2) 이번에는 clean이란 명령어입니다

clean:
        rm -f main main.o test.o

즉 main main.o test.o 을 삭제하는 명령입니다

이 두 줄을 위에서 만든 Makefile 뒷부분에 추가합시다.

        linux) make clean
        rm -f main main.o test.o
        

        linux) make
        gcc -c main.c
        gcc -c test.c
        gcc -o main main.o test.o

make clean이라는 작업 또한 중요한 작업입니다

clean 이라는 목표는 단지 화일들을 지우는 일입니다.

clean: 옆에는 아무런 연관 화일들이 없습니다

그리고 오로지 rm -f main main.o test.o 라는 명령만 실행합니다.

참고로 make만 해선 실행되니 않고 make clean을 해주어야 합니다.


3) all: main이라는 명령입니다

all: main

이 한 줄을 Makefile 맨 앞에 넣어두도록 합시다.

        linux) make clean
        linux) make all
        gcc -c main.c
        gcc -c test.c
        gcc -o main main.o test.o

all 이라는 명령은 목표에 그 밑에 나오는 다른 목표만이 들어있을 뿐, 아무런 명령도 없는 경우입니다. make all 하면 관련된 모든 것들이 만들어집니다.

만약 3개의 함수를 결합하는데

all: main1 main2 main3
main1: <생략>
main2: <생략>
main3: <생략>

보통 make all 하면 main1, main2, main3가 모두 만들어집니다. 그런데 어떤 경우에는 main1만 또는 main2만을 만들고 싶을 때도 있을 겁니다. 괜히 필요없는 main3를 빼고 싶은 때에는...

        linux) make main1
        linux) make main2

물론 일반적으로 다 만들고 싶을 때는 make all 이나 makef를 하면 됩니다.
 
Q makefile이 없어도 실행이되는가? 간단한 컴파일은 실행시켜 줍니다


make 명령어 추가


위에 설명된 make명령에 몇가지 더 추가하여 보겠습니다

CC = gcc


all : main.o test.o

        @echo TEST C MAKE # echo 메시지를 출력한다

        @$(CC) -o emb main,o test.o


main.o : main.c

        @echo main.o를 만들었습니다

        @$(CC) -c main.c


test.o : test.c

        @$(CC) -c test.c

        @echo main.o를 만들었습니다


clean :

        @rm -rf main.o

        @rm -rf test.o

        @rm -rf emb


run : all

        @ls -al

        @./emb

 

추가된 명령어들을 보면


CC = gcc 변수를 선언한 경우입니다 실제 gcc문구들은 $(CC)로 바꾸어서 사용합니

쉽게 말해 메크로 기능입니다 (메크로는 다시 정리하겠습니다)


다르게 설명하면

CC = -g -c or CC = main.o test.o 와 같은 긴문장을 해결 할때 간편하게 작성하는 역할을 해줍니다


@ 명령문을 보이 않게 합니다

linux)make all 하게되면

$(CC) -o emb main.o test.o 메시지를 출력하게 되는데 @을 걸어주면 메시지가 출력되지 않습니다


echo make명령중 메시지를 출력하고 싶을때 사용합니다

예를 들어 위에
linux)make main.o 를 실행시

아래에 main.o를 만들었습니다 라고 출력되며 echo앞에 @있어 echo는 출력 되지 않습니다


# 주석처리 한다라는 뜻입니다 C언어에서 (// 와 /* */)주석처리 되는것과 같다

'Embeded C' 카테고리의 다른 글

5_6 함수의 원형(선언)  (0) 2011.04.25
5_5 함수의 정의  (0) 2011.04.25
5_3 함수의 분리와 결합  (0) 2011.04.20
IEEE 754 표준 32비트 부동소수점 표현  (2) 2011.04.20
5_2 함수의 호출과 실행(작성중)  (0) 2011.04.20