오늘은 맑음

[Linux] gcc를 이용한 컴파일 / Makefile study(2) 본문

Makefile

[Linux] gcc를 이용한 컴파일 / Makefile study(2)

자전거 타는 구구 2021. 4. 3. 23:56
반응형

 이번에는 makefile을 실제로 작성 해보겠습니다.

 먼저 linux환경이 필요한데, linux환경 없이 window만 사용하신 분은 본 블로그의 wsl 설치 포스팅을 참조하시기 바랍니다.

 pwd에는 다음과 같이 구성해줍니다.

  • Makefile
  • src(directory)
  • bin(directory)

 src에는 main함수를 포함한 다양한 source 파일들이 들어있고, bin에는 만들어진 실행파일이 들어갑니다. src 폴더에는 현재 hello를 출력하는 main.c와 world를 출력하는 world.c, world.h파일 총 세개가 있습니다.

 

 작성된 makefile은 아래와 같습니다.


CC := gcc (c파일을 컴파일 한다면 gcc, c++을 컴파일 한다면 g++ 컴파일러를 선택하시면 됩니다.)

 

CFLAGS = -Wall -g

 

TARGET  = bin/helloworld

SRC_DIRS = src

 

SRCS = \$(foreach dir, \$(SRC_DIRS), \$(wildcard $(dir)/*.c))

OBJS = \$(SRCS: .c=.o)

 

all : clean $(OBJS)

        \$(CC) -o \$(TARGET) \$(OBJS)

 

clean : 

        rm -f $(OBJS)

        rm -f $(EXE)


CFLAGS:  gcc 컴파일 옵션을 넣어줍니다. 현재 옵션은 -Wall과 -g 두개 입니다.

-Wall : 모호한 코드에 대해서 경고를 보냄

 실제로 Wall 옵션이 들어간 상태에서 컴파일 한 실행파일을 실행하면 warning으로 경고를 보내줍니다.

-g : 디버그 정보를 추가

이 외에도 많은 옵션이 있습니다.(-O : 컴파일 최적화 등등...)

 

LDFLAGS : 현재 공유라이브러리를 사용하지 않기 때문에 제외

 

TARGET : bin파일 경로와 생성될 실행파일의 이름을 저장

 

SRC_DIRS : src파일이 들어있는 경로. 위에서 언급한 대로 src파일을 경로로 저장.

 

SRCS : SRC_DIRS로 들어가서 내부의 모든 *.c파일의 정보를 담습니다. foreach는 반복문 매크로로 foreach dir, $(SRC_DIRS)에 있는 directory를 차례대로 들어갑니다. 이 후 *.c 확장자의 파일 정보를 모두 SRCS에 담습니다.

 

OBJS : object파일의 정보. 여기서는 (SRCS.c=.o)라는 매크로를 이용. SRCS에 들어있는 모든 .c 확장자를 .o로 변환해서 OBJS에 저장 ex) SRCS에 main.c가 담겨있다면 OBJS에 main.o를 저장.

 

그 다음에는 all과 clean이 있습니다.

all은 make all을 수행하면 동작하는 명령어들이며, clean은 make clean을 수행하면 동작하는 명령어입니다.

 

make all 

 : 기존의 오브젝트 파일을 삭제. 새로 만들면 overwrite가 되긴 하지만 새로 컴파일 한다면 기존의 오브젝트 파일은 필요 없으므로 혼란을 피하기 위해 삭제.

이 후 gcc, TARGET과 컴파일에 사용되는 OBJS파일을 이용해서 실행파일을 생성.

 

make clean

 : source 코드를 제외한 모든 오브젝트 파일과 실행파일을 삭제.

 

이렇게 makefile을 작성한 후 make를 수행하면 src 폴더 내에 오브젝트 파일이 생성됩니다.

 

 

소스 파일과 생성된 오브젝트 파일

 

또한 bin에 helloworld라는 실행파일이 생깁니다.

 

helloworld    실행파일

 

그리고 위의 실행파일을 실행시키면 아래와 같이 출력됩니다.

 

 

 

반응형
Comments