gcc를 컴파일 할때 효율적으로 컴파일 하는 make에 대해서 알아봅시다.
C언어를 사용하여 문법에 맞게 논리적으로 작성된 프로그램을 원시 파일 또는 소스 파일이라고 부릅니다.
C언어를 통해 작성된 소스파일의 확장자는 .c가 됩니다.
컴퓨터가 0과 1로 이루어져있기 때문에 Source file을 0,1로 되어있는 file로 변경해줘야하는데, 그 작업을 compile이라고 합니다. compile은 complier에 의해 수행되며, 컴파일이 끝나 기계어로 변환된 파일을 오브젝트 파일(Object file)이라고 합니다.
확장자는 .o나 .obj가 됩니다.
하나 이상의 오브젝트 파일과 라이브러리 파일, 시동 코드(운영체제와의 인터페이스를 담당하는 코드) 등을 합쳐서 하나의 파일로 만드는 작업을 링크(link)라고 합니다.
link가 끝나면 하나의 새로운 실행파일이나 라이브러리 파일을 생성합니다.
- 우선 make파일을 만들기 전 calc.c와 core.c 라는 source file이 2개 있다고 가정하겠습니다.
gcc -c -o calc.o calc.c gcc -c -o core.o core.c
- -c 옵션은 object 파일을 생성하는 옵션이고,
- -o 옵션은 생성 될 파일 이름을 지정하는 옵션입니다.
(-o 옵션을 주지 않으면 알아서 a.out으로 생성합니다.)
다음은 실행파일을 생성해보겠습니다.
gcc -o calc.exe calc.o core.o
- Make는 파일 관리 유틸리티로서, 정의에 의하면 파일간의 종속 관계를 파악하여 Makefile(기술파일)에 적힌 대로 컴파일러에게 명령하여 SHELL명령이 순차적으로 실행될 수 있게 합니다.
- Make file 기본 구조
CC = gcc //매크로 정의 calc.exe: calc.o core.o //타겟할 목표: 의존파일, 의존 파일 $(CC) -o calc.exe calc.o core.o //실행할 명령어들 calc.o: calc.c $(CC) -c -o calc.o calc.c core.o: core.c $(CC) -c -o core.o core.c
여기서 $()는 매크로입니다. cc=gcc로 정의했더니 cc에 gcc
가 들어가는 것 처럼 위에 변수만 바꾸는 것으로 명령어의 command를 쉽게 바꿀 수 있습니다.
- 매크로를 참조할 때는 소괄호나 중괄호를 둘러싸고 앞에 $를 붙여야합니다.
- -W -Wall은 컴파일 시 컴파일이 되지 않을 정도의 오류라도 모두 출력되게 하는 옵션입니다.
CC = gcc CFLAGS = -W -Wall Target = calc.exe Object = calc.o core.o //메크로 정의 all : $(Target) $(Target): $(Object) $(CC) $(CFLAGS) -o $@ $^ clean: sudo rm *.o $(Target)
- 명령어에서 make만 실행하면 자동으로 제일 상위에 있는 target을 실행합니다. 여기서 조건을 체크 하는데, 조건이 target에 있다면 그 target역시 실행합니다.
즉 재귀적으로 실행하는 것 입니다.
- make file의 중요한 규칙은 target이 아닌 조건들, 조건이 시간이 변경 되었는지를 확인하고 바뀌었다면 실행하는 것이다.